我正在为我的服务(ClassUnderTest
)类编写单元测试。我正在为所有数据成员使用@Mock
。
现在,要测试ClassUnderTest
,我需要为ClassUnderTest
创建一个对象。
我有两个选择,为ClassUnderTest
创建一个新对象,然后在构造函数中发送模拟。
或使用 @InjectMocks
的 ClassUnderTest
。
我想知道,这两种方法是相同的还是使用@InjectMocks
?
@Mock
private NodeLaunchWorkflowService nodeLaunchWorkflowService;
@InjectMocks
private NodeLaunchWorkflowController nodeLaunchWorkflowController;
或
@Mock
private NodeLaunchWorkflowService nodeLaunchWorkflowService;
private NodeLaunchWorkflowController nodeLaunchWorkflowController;
@Before
public void setUp() throws JSONException {
MockitoAnnotations.initMocks(this);
nodeLaunchWorkflowController = new NodeLaunchWorkflowController(nodeLaunchWorkflowService)
}
恰恰相反:使用构造函数模式而不是@InjectMocks
有明显的优势。特别是,作为@InjectMocks文档和其他文章,Mockito会默默地未能注入模拟的原因有很多。这意味着,看起来无辜的阶级变化可能会导致您的测试中的晦涩失败,而不是构造函数呼叫会导致的明显汇编失败。
使用某些自动重构工具,您甚至可以以正确和自动更改的方式更改课程;它不会与@InjectMocks一起,这使得构造函数在Mockito中反射深刻。
@InjectMocks对于旧版代码中的非常快速的单元测试覆盖范围可能很有用,但是在新开发中,构造组件易于测试的组件(例如,使用暴露的构造函数)更好,然后使用它们进行测试清除电话。