如何在JUnit5中使用Mockito

Dan*_*fer 59 java unit-testing mockito junit5

如何使用Mockito和JUnit 5注射?

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

Nic*_*lai 81

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

手动

Mockito::mock无论JUnit版本(或测试框架)如何,都可以手动创建模拟.

基于注释

使用@Mock -annotation和相应的调用MockitoAnnotations::initMocks创建嘲笑的作品无论JUnit版本(或测试框架,对于这个问题,但测试代码是否在一个模块中最终还是不是Java 9干扰可能在这里,取决于).

Mockito扩展

JUnit 5有一个强大的扩展模型,Mockito最近在组/工件ID org.mockito:mockito-junit-jupiter下发布了一个.

您可以通过添加@ExtendWith(MockitoExtension.class)到测试类并使用注释模拟字段来应用扩展@Mock.来自MockitoExtensionJavaDoc:

@ExtendWith(MockitoExtension.class)
public class ExampleTest {

    @Mock
    private List list;

    @Test
    public void shouldDoSomething() {
        list.add(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mockito文档对扩展仍然有点沉默.

没有规则,没有跑步者

JUnit 4规则和运行程序在JUnit 5中不起作用,因此无法使用MockitoRuleMockito运行程序.

  • 现在有一个官方的Mockito Junit5扩展,相当于MockitoJUnitRunner - > mockito-junit-jupiter (5认同)

Jon*_*han 37

使用Mockito的MockitoExtension.扩展包含在新工件中mockito-junit-jupiter:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.23.4</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它允许您像使用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

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • `@ExtendWith(MockitoExtension.class)` 相当于 JUnit4 的 `@RunWith(MockitoJUnitRunner.class)` (9认同)

dav*_*xxx 7

有许多不同的方法可以做,但是更org.junit.jupiter.api.extension.Extension简洁的方法,也尊重JUnit 5的理念,是为Mockito 创建一个 。

1)手动创建模拟会使其他Mockito检查无法确保您正确使用框架的好处。

2)调用MockitoAnnotations.initMocks(this)每个测试类都是我们可以避免的样板代码。
并且在抽象类中进行此设置也不是一个好的解决方案。
它将每个测试类耦合到一个基类。
如果出于种种原因需要新的基础测试类,则可以完成3级类层次结构。请避免那样。

3)测试规则是JUnit 4的特异性。
甚至不用考虑。
并且文档对此很清楚:

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

4)Test Runner实际上不是扩展JUnit 5框架的方法。
通过使用JUnit 5扩展,JUnit 5提供了用于编写测试的扩展模型,从而简化了JUnit 4 Runners的工作。
甚至不用考虑。

因此,请偏向org.junit.jupiter.api.extension.Extension于此。


编辑:实际上,Mockito捆绑了木星扩展名: mockito-junit-jupiter

然后,非常简单易用:

import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {
     ...    
}
Run Code Online (Sandbox Code Playgroud)

这是乔纳森(Jonathan)出色回答的补充。

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

java.lang.NoSuchMethodError:org.junit.platform.commons.support.AnnotationSupport.findAnnotation(Ljava / util / Optional; Ljava / lang / Class;)Ljava / util / Optional;

问题是,这 mockito-junit-jupiter取决于两个独立的库。例如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>
Run Code Online (Sandbox Code Playgroud)

问题是我用过的junit-jupiter-api:5.0.1

因此,作为junit-jupiter-api仍然经常移动在API方面,一定要依赖于同一版本的junit-jupiter-apimockito-junit-jupiter要看。


Dan*_*fer 5

您必须使用新@ExtendWith注释。

不幸的是,还没有发布扩展。在github 上,您可以看到扩展的测试版实现。作为示例演示测试