在 JUnit4中我只能使用 @RunWith(MockitoJUnitRunner.class)注释。在 JUnit5中没有 @RunWith注释?
@RunWith(MockitoJUnitRunner.class)
@RunWith
必须使用新的 @ExtendWith注释。
@ExtendWith
不幸的是,目前还没有发布任何扩展。 - 扩展名/src/main/java/com/exampleto/MockitoExtension.java”rel = “ nofollow noReferrer”> github 你可以看到这个扩展的 beta 实现
JUnit4规则和运行程序在 JUnit5中不工作,因此不能使用 MockitoRule和 Mockito 运动员。
MockitoRule
<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。
org.junit.jupiter.api.extension.Extension
问题是我用的是 junit-jupiter-api:5.0.1。
junit-jupiter-api:5.0.1
1) 手动创建模拟失去了额外的 Mockito 检查的好处,以确保您正确地使用框架。
因此,当 junit-jupiter-api在 API 方面仍然经常移动时,请确保您依赖于 mockito-junit-jupiter所依赖的相同版本的 junit-jupiter-api。
junit-jupiter-api
mockito-junit-jupiter
使用 Mockito 有不同的方法——我将一个一个地介绍。
2)在每个测试类中调用 MockitoAnnotations.initMocks(this)是我们可以避免的常规代码。
MockitoAnnotations.initMocks(this)
不管 JUnit 版本(或者测试框架)如何,使用 Mockito::mock手动创建模拟都是可行的。
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可能会干扰,这取决于测试代码最终是否在模块中) ,制造假象都可以正常工作。
MockitoAnnotations::initMocks
3)测试规则是 JUnit 4的特异性。
JUnit 5的 一个强大的扩展模型和 Mockito 最近发布了一个组/工件 ID [俄语][俄语][俄语][俄语][俄语][俄语][俄语]下的 一个强大的扩展模型和 Mockito。
可以通过将 @ExtendWith(MockitoExtension.class)添加到测试类并使用 @Mock对模拟字段进行注释来应用扩展。来自 MockitoExtension的 JavaDoc:
@ExtendWith(MockitoExtension.class)
@Mock
MockitoExtension
@ExtendWith(MockitoExtension.class) public class ExampleTest { @Mock private List list; @Test public void shouldDoSomething() { list.add(100); } }
MockitoExtension 文档 描述了实例化模拟的其他方法,例如使用构造函数注入(如果在测试类中使用 final 字段)。
它允许您像使用 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 ... }