无论构造函数签名如何,都应模拟类的属性

时间:2018-06-20 20:15:12

标签: java junit mocking mockito constructor-injection

课程

public class Foo {
  private MyClass obj;

  public Foo(String s, int i, boolean b) {
    MyOtherClass otherObj = OtherClassFactory.getInstance();
    this.obj = new MyClass(s, i, b, otherObj);
  }

  //More Code
}

构造函数采用一些参数,从工厂检索实例,然后使用所有这些局部变量实例化其具有的一个属性(obj)。

但是,我所关心的只是嘲笑obj本身。我不在乎构造函数的任何参数,也不在意otherObj

我尝试仅注入属性:

public class FooTest {
  @Mock
  private MyClass fakeObj;
  @InjectMocks
  private Foo foo;

  //More Code
}

但是抱怨不了,

  

无法实例化类型为“ @InjectMocks”的名为“ foo”的class Foo字段。   您尚未在字段声明中提供实例,所以我试图   构造实例。但是构造函数或初始化   块引发异常:OtherClassFactory尚未初始化。

这是我正在尝试做的事情,如果可以的话,怎么做?如果没有,我需要模拟OtherClassFactory,我该怎么做?

1 个答案:

答案 0 :(得分:2)

我将提供第二个构造函数,包私有的,像这样。

public Foo(String s, int i, boolean b) {
    this(new MyClass(s, i, b, OtherClassFactory.getInstance());
}

Foo(MyClass obj) {
   this.obj = obj;
}

然后在测试中,您只需编写

Foo toTest = new Foo(mockMyClass);

其中mockMyClass是您的Mockito模拟。