我对SpringJUnit4ClassRunner
的用法有疑问。对于纯Junits或单元测试用例,我们应该使用基于Spring的注释,例如@Autowired
和SpringJUnit4ClassRunner
,或者我们应该仅使用MockitoJUnitRunner
而不是@RunWith
注释位于顶部测试类?
我的意思是替换
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-applicationContext.xml" })
只是
@RunWith(MockitoJUnitRunner.class)
在班级的顶部。它对我有用。
在Junits中,我们通常不会进行任何外部调用,例如调用DB或调用其他Web服务。我们必须在此服务对象上使用@Mock
注释来模拟这些外部调用。然后创建我们正在测试的类的真实对象,这取决于这些模拟。然后我们可以在真实对象上使用@InjectMocks
,以便它将被模拟对象注入。
示例服务-A->呼叫 - >服务-B->呼叫 - >服务-C
在测试A时,我们应该模拟服务B&在测试Service-B时,我们应该模拟Service-C。
一些代码片段
@RunWith(MockitoJUnitRunner.class)
public class TestServiceA {
@Mock
B mockObj;
@InjectMocks
A realObj;
@Test
public void testServiceA() {
.....
.....
}
}
所以,我觉得对于单元测试用例,我们不需要依赖Spring容器来为我们提供我们正在测试的类的实例。
请提出您的建议。
使用SpringJUnit4ClassRunner.class代替MockitoJUnitRunner.class
答案 0 :(得分:4)
如果您尝试简单地单独测试没有依赖项的类,就像您描述的那样,就不需要SpringJUnit4ClassRunner。此运行器能够生成完整的弹簧上下文,其中包含您可以在(测试)应用程序上下文配置中定义的(模拟)对象。使用这种机制,SpringJUnit4ClassRunner比常规的MockitoJUnitRunner慢得多。
SpringJUnit4ClassRunner非常强大,可用于集成测试。
我默认以MockitoJUnitRunner开头,如果我达到了这个跑步者的极限,例如因为我需要模拟构造函数,静态方法或私有变量,我就切换到PowerMockJUnitRunner。这对我来说是最后的手段,因为它通常告诉代码是“坏的”而不是写入进行测试。其他跑步者通常不需要进行单独的单元测试。
答案 1 :(得分:0)
基于Sven的答案,我们假设您需要测试类的组装,同时模拟出进入数据库的位,或调用外部服务,您将希望使用SpringJUnit4ClassRunner进行测试。
如果您试图将一个Java类作为一个单元进行测试,同时模拟出集成位和本地协作者,那么使用MockitoJUnitRunner运行测试就足够了并且也更快。