![](/img/trans.png)
[英]What's the difference between @RunWith(MockitoJUnitRunner.class) and @RunWith(SpringJUnit4ClassRunner.class)? When to use it appropriately?
[英]Using MockitoJUnitRunner.class instead of SpringJUnit4ClassRunner.class
我对SpringJUnit4ClassRunner
的用法有SpringJUnit4ClassRunner
。 对于纯Junits或单元测试用例,我们应该使用基于Spring的注释,例如@Autowired
和SpringJUnit4ClassRunner
还是应该只使用MockitoJUnitRunner
而不是Test类顶部的@RunWith
注释?
我的意思是更换
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-applicationContext.xml" })
只是
@RunWith(MockitoJUnitRunner.class)
在班上。 这个对我有用。
在Junits中,我们通常不会进行任何外部调用,例如调用DB或调用其他Web服务。 我们必须使用此服务对象上的@Mock
注释来模拟这些外部调用。 然后创建我们正在测试的类的真实对象,这取决于这些模拟。 然后我们可以在真实对象上使用@InjectMocks
,以便它将被注入@InjectMocks
对象。
示例服务-A->呼叫 - >服务-B->呼叫 - >服务-C
在测试A时,我们应该在测试Service-B时模拟服务B,我们应该模拟Service-C。
一些代码片段
@RunWith(MockitoJUnitRunner.class)
public class TestServiceA {
@Mock
B mockObj;
@InjectMocks
A realObj;
@Test
public void testServiceA() {
.....
.....
}
}
所以,我觉得对于Unit测试用例,我们不需要依赖Spring容器来为我们提供我们正在测试的类的实例。
请提出你的建议。
使用SpringJUnit4ClassRunner.class而不是MockitoJUnitRunner.class
如果您尝试简单地单独测试没有依赖项的类,就像您描述的那样,就不需要SpringJUnit4ClassRunner。 此运行器能够生成完整的弹簧上下文,其中包含您可以在(测试)应用程序上下文配置中定义的(模拟)对象。 使用这种机制,SpringJUnit4ClassRunner比常规的MockitoJUnitRunner慢得多。
SpringJUnit4ClassRunner非常强大,可用于集成测试。
我默认从MockitoJUnitRunner开始,如果我达到了这个运行器的限制,例如因为我需要模拟构造函数,静态方法或私有变量,我切换到PowerMockJUnitRunner。 这对我来说是最后的手段,因为它通常告诉代码是“坏的”而不是写入进行测试。 其他跑步者通常不需要进行隔离单元测试。
基于Sven的回答,让我们说你需要测试一个类的集合,同时模拟出去数据库的位,或者调用外部服务,你会看到用SpringJUnit4ClassRunner运行测试。
如果您尝试将单个Java类作为一个单元进行测试,同时模拟集成位和本地协作者,那么使用MockitoJUnitRunner运行测试也足够快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.