使用MockitoJUnitRunner.class而不是SpringJUnit4ClassRunner.class

时间:2015-06-28 15:47:56

标签: java unit-testing junit

我对SpringJUnit4ClassRunner的用法有疑问。对于纯Junits或单元测试用例,我们应该使用基于Spring的注释,例如@AutowiredSpringJUnit4ClassRunner,或者我们应该仅使用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

2 个答案:

答案 0 :(得分:4)

如果您尝试简单地单独测试没有依赖项的类,就像您描述的那样,就不需要SpringJUnit4ClassRunner。此运行器能够生成完整的弹簧上下文,其中包含您可以在(测试)应用程序上下文配置中定义的(模拟)对象。使用这种机制,SpringJUnit4ClassRunner比常规的MockitoJUnitRunner慢得多。

SpringJUnit4ClassRunner非常强大,可用于集成测试。

我默认以MockitoJUnitRunner开头,如果我达到了这个跑步者的极限,例如因为我需要模拟构造函数,静态方法或私有变量,我就切换到PowerMockJUnitRunner。这对我来说是最后的手段,因为它通常告诉代码是“坏的”而不是写入进行测试。其他跑步者通常不需要进行单独的单元测试。

答案 1 :(得分:0)

基于Sven的答案,我们假设您需要测试类的组装,同时模拟出进入数据库的位,或调用外部服务,您将希望使用SpringJUnit4ClassRunner进行测试。
如果您试图将一个Java类作为一个单元进行测试,同时模拟出集成位和本地协作者,那么使用MockitoJUnitRunner运行测试就足够了并且也更快。