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。

我也会这么做。