Java:模拟调用外部库以测试构造函数



我正在尝试对以下ClassAClassA(String)构造函数进行单元测试:

import ExternalObject;
class ClassA{
    private ExternalObject externalObject;
    public ClassA() {
        super();
    }
    public ClassA(String string) {
        super();
        this.externalObject = new ExternalObject().parseString(string);
    }
}

我想模拟new ExternalObject().parseString(string)调用并使用示例ExternalObject对象将其存根。

我已经研究了Mockito,

但似乎Mockito无法完成这项任务,因为:

  • Mockito只能模拟方法,不能模拟方法中的语句。
  • Mockito要求在模拟它们之前创建对象。Mockito需要一个类的实例,然后才能开始模拟。因此,即使我将new ExternalObject().parseString()调用放在 ClassA 类中的单独方法中,如果没有 ClassA 实例,我也无法调用它。

是否可以在 Mockito(或任何其他模拟库(中执行此操作而无需重写大量代码?我对小的代码更改持开放态度,以使其更易于测试。

为了模拟ExternalObject您必须能够提供测试流中使用的ExternalObject实例。

只要在public ClassA(String string)内部创建ExternalObject,那将是困难的。

为了使您的ClassA更易于测试,您需要能够在构造ClassA时提供ExternalObject实例。

例如:

class ClassA{
    private ExternalObject externalObject;
    public ClassA() {
        super();
    }
    public ClassA(ExternalObject externalObject, String string) {
        super();
        this.externalObject = externalObject.parseString(string);
    }
}

然后可以按如下方式进行测试:

public class ClasssATest {
    @Test
    public void someTest() {
        String input = "a string";
        ExternalObject externalObject = Mockito.mock(ExternalObject.class);
        Mockito.when(externalObject.parseString(eq(input))).thenReturn(externalObject);
        ClassA sut = new ClassA(externalObject, input);
        ...
    }
}

这里的关键点是:将外部依赖项注入到您的类中。进行此更改后,测试变得更加容易,更一般地说,此方法可以通过交换该外部依赖项的实现来更轻松地更改系统行为。

相关内容

  • 没有找到相关文章

最新更新