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

时间:2018-01-29 07:27:49

标签: java unit-testing mockito

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

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 needs an instance of the class before you can begin mocking。因此,即使我将new ExternalObject().parseString()调用放在ClassA类中的单独方法中,我也无法在没有ClassA实例的情况下调用它。

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

1 个答案:

答案 0 :(得分:3)

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

只要{<1}}在 ExternalObject内创建,就会很困难。

为了使您的public ClassA(String string)更易于测试,您需要在构建ClassA时提供ExternalObject的实例。

例如:

ClassA

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

class ClassA{

    private ExternalObject externalObject;

    public ClassA() {
        super();
    }

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

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