我有一个利用依赖注入的类,并且具有一个初始化其他字段的非默认构造函数。基本上,该类看起来像这样:
public class NonDefaultConstructor {
private final String name;
@Inject
private SomeService service;
public NonDefaultConstructor(ParameterObject po) {
this.name = po.getName();
}
}
有了这个ParameterObject
:
public class ParameterObject {
private String name;
public String getName() {
return name;
}
}
我想创建一个Mockito测试,以注入服务SomeService
的模拟和构造函数自变量ParameterObject
的模拟。此尝试不起作用,因为它尝试模拟尚未初始化的字段上的行为。
public NonDefaultConstructorTest {
@Mock
private SomeService service;
@Mock
private ParameterObject po;
@InjectMocks
private NonDefaultConstructor classUnderTest;
@BeforeEach
private void setup() {
given(po.getName()).willReturn("name")
MockitoAnnotations.initMocks(this);
}
}
在ParameterObject
方法中创建setup
也不起作用,因为这也需要在此处构造NonDefaultConstructor
,然后再注入SomeService
。
我知道可以通过使用反射手动注入字段来解决此问题,但我希望使用更优雅的解决方案。
答案 0 :(得分:1)
您可以通过以下设置方法“手动”创建ParameterObject
:
@BeforeEach
private void setup() {
po = Mockito.mock(ParameterObject.class);
given(po.getName()).willReturn("name");
MockitoAnnotations.initMocks(this);
}
为使此工作有效,您还需要从中删除@Mock
批注
@Mock
private ParameterObject po;
现在,您的ParameterObject
在创建任何其他模拟之前就已创建和配置,然后使用非默认构造函数注入到您的类中。