如何在 JUnit5中使用 Mockito

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

必须使用新的 @ExtendWith注释。

不幸的是,目前还没有发布任何扩展。 - 扩展名/src/main/java/com/exampleto/MockitoExtension.java”rel = “ nofollow noReferrer”> github 你可以看到这个扩展的 beta 实现

173166 次浏览

JUnit4规则和运行程序在 JUnit5中不工作,因此不能使用 MockitoRuleMockito 运动员

:

<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>

有不同的方法可以做,但更干净的方法,也尊重 JUnit5的哲学是为 Mockito 创建一个 org.junit.jupiter.api.extension.Extension

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

1) 手动创建模拟失去了额外的 Mockito 检查的好处,以确保您正确地使用框架。

因此,当 junit-jupiter-api在 API 方面仍然经常移动时,请确保您依赖于 mockito-junit-jupiter所依赖的相同版本的 junit-jupiter-api

使用 Mockito 有不同的方法——我将一个一个地介绍。

2)在每个测试类中调用 MockitoAnnotations.initMocks(this)是我们可以避免的常规代码。

手动操作

不管 JUnit 版本(或者测试框架)如何,使用 Mockito::mock手动创建模拟都是可行的。

在抽象类中进行这种设置也不是一个好的解决方案。

基于注释

它将每个测试类耦合到一个基类。

使用 @ 嘲笑-注释和相应的对 < a href = “ https://static.javadoc.io/org.modito/modito-core/2.2.28/org/modito/MockitoAnnotations.html”rel = “ noReferrer”> MockitoAnnotations::initMocks的调用 不管 JUnit 版本如何(或者测试框架如何,但是 Java9可能会干扰,这取决于测试代码最终是否在模块中) ,制造假象都可以正常工作。

如果出于好的理由需要一个新的基本测试类,那么最后就会得到一个3级的类层次结构。请不要这样。< br >

Mockito 扩建公司

3)测试规则是 JUnit 4的特异性。

JUnit 5的 一个强大的扩展模型和 Mockito 最近发布了一个组/工件 ID [俄语][俄语][俄语][俄语][俄语][俄语][俄语]下的 一个强大的扩展模型和 Mockito。

想都别想。

可以通过将 @ExtendWith(MockitoExtension.class)添加到测试类并使用 @Mock对模拟字段进行注释来应用扩展。来自 MockitoExtension的 JavaDoc:

@ExtendWith(MockitoExtension.class)
public class ExampleTest {


@Mock
private List list;


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


}

MockitoExtension 文档 描述了实例化模拟的其他方法,例如使用构造函数注入(如果在测试类中使用 final 字段)。

没有规则,没有跑步者

JUnit4规则和运行程序在 JUnit5中不工作,因此不能使用 MockitoRuleMockito 运动员

因此,当 junit-jupiter-api在 API 方面仍然经常移动时,请确保您依赖于 mockito-junit-jupiter所依赖的相同版本的 junit-jupiter-api

它允许您像使用 JUnit4那样编写测试:

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


...
}