Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 如何在JUnit5中使用Mockito_Java_Unit Testing_Mockito_Junit5 - Fatal编程技术网

Java 如何在JUnit5中使用Mockito

Java 如何在JUnit5中使用Mockito,java,unit-testing,mockito,junit5,Java,Unit Testing,Mockito,Junit5,如何使用Mockito和JUnit 5的injection 在JUnit4中,我可以使用@RunWith(MockitoJUnitRunner.class)注释。JUnit5中没有@RunWith注释?您必须使用新的@extendedwith注释 不幸的是,目前还没有发布任何扩展。 在上,您可以看到扩展的测试版实现。例如。使用Mockito有不同的方法-我将逐一介绍 人工 无论JUnit版本(或测试框架)如何,都可以使用works手动创建模拟 基于注释的 使用-annotation和对的相应调用

如何使用Mockito和JUnit 5的injection


在JUnit4中,我可以使用
@RunWith(MockitoJUnitRunner.class)
注释。JUnit5中没有
@RunWith
注释?

您必须使用新的
@extendedwith
注释

不幸的是,目前还没有发布任何扩展。
在上,您可以看到扩展的测试版实现。例如。

使用Mockito有不同的方法-我将逐一介绍

人工 无论JUnit版本(或测试框架)如何,都可以使用works手动创建模拟

基于注释的 使用-annotation和对的相应调用 无论JUnit版本如何(或测试框架如何,但Java 9可能会在这里产生干扰,这取决于测试代码是否最终出现在模块中)

莫基托扩张 JUnit5和Mockito最近在组/工件ID下发布了一个

您可以通过将
@extendedwith(MockitoExtension.class)
添加到测试类并用
@Mock
注释模拟字段来应用扩展。从
MockitoExtension
的JavaDoc:

@ExtendWith(MockitoExtension.class)
public class ExampleTest {

    @Mock
    private List list;

    @Test
    public void shouldDoSomething() {
        list.add(100);
    }

}
描述实例化mock的其他方法,例如构造函数注入(如果您在测试类中rpefer final字段)

没有规则,就没有跑步者
JUnit 4规则和运行程序在JUnit 5中不起作用,因此和不能使用。

有不同的方法可以使用,但更干净的方法也是尊重JUnit 5理念的方法是为Mockito创建一个
org.JUnit.jupiter.api.extension.extension

1) 使您失去额外的Mockito检查以确保正确使用框架的好处。

2) 在每个测试类中调用
MockitoAnnotations.initMocks(this)
是我们可以避免的锅炉板代码。
在抽象类中进行此设置也不是一个好的解决方案。
它将每个测试类耦合到一个基类。
如果有充分的理由需要一个新的基本测试类,那么可以使用一个3级的类层次结构来完成。请避免这样做。

3) 测试规则是JUnit 4的专用性。
想都别想。
政府很清楚:

但是,如果您打算为JUnit5开发一个新的扩展,请 使用JUnit Jupiter的新扩展模型,而不是基于规则的扩展模型 JUnit4的模型

4) 测试运行程序并不是扩展JUnit5框架的方法。
由于JUnit 5的扩展,JUnit 5为编写测试提供了一个扩展模型,从而简化了JUnit 4的运行程序。
想都别想。

因此,选择
org.junit.jupiter.api.extension.extension
方式


编辑:实际上,Mockito捆绑了一个jupiter扩展:

然后,使用起来非常简单:

import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {
     ...    
}
这是对乔纳森极好的回答的补充

通过将
mockito junit jupiter
工件添加为依赖项,在执行测试时使用
@extendedwith(MockitoExtension.class)
会产生以下异常:

java.lang.NoSuchMethodError: findAnnotation(Ljava/util/Optional;Ljava/lang/Class;)Ljava/util/Optional

问题是,
mockitojunitjupiter
依赖于两个独立的库。 例如,对于
mockito junit jupiter:2.19.0

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.19.0</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.1.0</version>
  <scope>runtime</scope>
</dependency>

org.mockito
莫基托磁芯
2.19.0
编译
org.junit.jupiter
JUnitJupiter api
5.1.0
运行时
问题是我使用了JUnitJupiter api:5.0.1

因此,
junit jupiter api
在api方面仍然经常移动,请确保您使用与
mockito junit jupiter
所依赖的相同版本的
junit jupiter api

使用mockito的。扩展包含在一个新的工件中
mockito junit jupiter


org.mockito
莫基托朱庇特酒店
2.23.4
测试
它允许您编写与JUnit 4相同的测试:

import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

@ExtendWith(MockitoExtension.class)
class MyTest {

    @Mock
    private Foo foo;

    @InjectMocks
    private Bar bar; // constructor injection

    ...
}

现在有一个官方的Mockito Junit5扩展,它相当于Mockito JUnitRunner->Mockito junit Jupiter当Mockito的官方扩展发布时,写了一篇博客文章,详细介绍了如何配置和使用它:用
@Test
注释的方法需要是公共的还是“包私有的”是否足够好?当使用Jupiter(通常称为“JUnit 5”)运行测试时,测试方法只需要是包可见的。为什么不
mockito JUnit Jupiter
获取正确版本的
JUnit Jupiter api
?@haelix,因为用于此依赖项的版本策略依赖于mockito库。看看这里的版本
mockitojunitjupiter:2.19.0
。而JUnitJupiter版本以
5
开头。mockito junit jupiter应该在其工件标识符中指定两件事情(mockito版本和junit jupiter版本),以使事情更清楚。例如,
mockito-junit-jupiter-5.1:2.19.0
表示该库是为junit-jupiter 5.1设计的。
MockitoExtension
似乎不存在于
mockito-core
版本3.0.0中。@Thunderforge这是在
mockito-junit-jupiter
@extendedwith(MockitoExtension.class)中定义的
相当于JUnit4的
@RunWith(MockitoJUnitRunner.class)
,我可以在中使用MockitoExtension.class对模拟对象的方法执行多个返回值不同的方法调用吗JUnit5@RajHassani是的,你可以看到。