Java 模拟类的属性而不考虑构造函数签名
课程Java 模拟类的属性而不考虑构造函数签名,java,junit,mocking,mockito,constructor-injection,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 } 构造函数接受一些参数,从工厂检索实例,并使用所有这些局部变量实
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
}
但这不管用,抱怨:
无法实例化类型为“类foo
”的名为“foo
”的@InjectMocks
字段。
您尚未在字段声明中提供实例,因此我尝试
构造实例。但是,构造函数或初始化
块引发异常:OtherClassFactory
尚未初始化
我想做的是可能的吗?如果是,怎么做?如果没有,我需要模拟
其他类工厂
,我将如何做?我将提供第二个构造函数,包私有,如下所示
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 mock。我也会这么做。