Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MockitoJUnitRunner.class而不是SpringJUnit4ClassRunner.class_Java_Unit Testing_Junit - Fatal编程技术网

Java 使用MockitoJUnitRunner.class而不是SpringJUnit4ClassRunner.class

Java 使用MockitoJUnitRunner.class而不是SpringJUnit4ClassRunner.class,java,unit-testing,junit,Java,Unit Testing,Junit,我有一个关于SpringJUnit4ClassRunner用法的问题。对于纯JUnit或单元测试用例,我们应该使用基于Spring的注释,如@Autowired以及SpringJUnit4ClassRunner,还是应该只使用MockitoJUnitRunner而不是在测试类顶部使用@RunWith注释 我是说替换 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "classpath:test-application

我有一个关于
SpringJUnit4ClassRunner
用法的问题。对于纯JUnit或单元测试用例,我们应该使用基于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&在测试服务B时,我们应该模拟服务C

一些代码片段

@RunWith(MockitoJUnitRunner.class)
public class TestServiceA {
    @Mock
    B mockObj;

    @InjectMocks
    A realObj;

    @Test
    public void testServiceA() {
    .....
    .....
    }
}       
因此,我觉得对于单元测试用例,我们不需要依赖Spring容器来提供我们正在测试的类的实例

请给出你的建议


使用SpringJUnit4ClassRunner.class而不是MockitoJUnitRunner.class

如果您试图简单地单元测试一个没有依赖项的类,如您所描述的,那么就不需要使用
SpringJUnit4ClassRunner
。这个运行程序能够使用(测试)应用程序上下文配置中定义的(模拟)对象生成完整的Spring上下文。使用这种机制,
SpringJUnit4ClassRunner
比常规的
MockitoJUnitRunner
慢得多

SpringJUnit4ClassRunner
对于集成测试非常强大


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

基于Sven的答案,假设您需要在模拟数据库位或调用外部服务的同时测试类集合,您可以使用SpringJUnit4ClassRunner运行测试

如果您试图将单个Java类作为一个单元进行测试,模拟集成位和本地协作者,那么使用MockitoJUnitRunner运行测试就足够了,而且速度也更快

您的测试不包含任何需要Spring干预的内容,因此显然您不需要它。@SotiriosDelimanolis-谢谢您的回复。这实际上是一个伪代码,类似于我的项目代码。实际上,在开始时,它在类的顶部有SpringJUnit4ClassRunner.class和ContextConfiguration({“classpath:test applicationContext.xml}),并在两个A&B对象上自动连接注释。没有嘲笑。我把它们都拿走了。所以基本上我想知道这种模仿是否是做Junits的正确方法。Spring测试框架也支持模拟对象。如图所示,我正在使用Mockito库来模拟对象。另外,我还以另一种方式思考——我们真的需要Junits中的SpringJUnit4ClassRunner和Spring库吗?可能相关:您可能希望使用Spring概要文件来声明与mock DB相关的内容。在这种情况下,您仍然可以测试spring配置(集成测试)。对于不需要spring的单元测试,可以使用MockitoJUnitRunner。