JUnit 5 使用 Mockito 2 进行测试
JUnit 5 刚出来那时,也就是第一个版本 5.0.0 时,还不能很好的支持 Mockito 的测试,因为 Mockito 没能跟得那么紧密。那时候 JUnit 5 只能试验性的提供了一个极不正式的 com.example.mockito.MockitoExtension, 看那包名就知道不是来真的,所以决定再等。JUnit 5 不再原生支持 JUnit 4 的 Rule,一切都将是 Extension,那也是要求 Mockito 能够与之俱进。现在等来了,JUnit 5 进化到了 5.2.0, Mockito 也早已有了一个单独的模块
在 Mockito 2.1.0 的 What's new in Mockito 2 中记述了 JUnit 5 为 Mockito 2 开发了一个 MockitoExtension。追溯到 Mockito 2 的 Release Notes, 我们发现 Mockito 2 官方最早引入 MockitoExtension 的版本是 2.16.3(2018-03023)。我对 Mockito 对 JUnit 5 支持的最新更新是从这个 Pull Request MockitoExtension for JUnit5 得知的。
一句话讲就是现在的 Mockito 2 有原生态的 MockitoExtension 来支援 JUnit 5, 可以非常放心可靠的让 JUnit 5 和 Mockito 2 一起稳定工作。因此前面那个包名带
下面来体验一下那个 MockioExtension,测试当中需要的依赖包含
都取了当前在 Maven 中央仓库的最新版本。
在 IntelliJ IDEA 2018.1.3 版本中运行接下来的测试用例,连
首先我们要有一个被测试类 UserService
然后创建它的测试用例 UserServiceTest
JUnit 5 下只能用
在 IntelliJ IDEA 中运行该测试
一切工作正常,方法被 Mock, Mock 对象自动被注入,
若要用
然后执行控制台命令
控制台下仍然是不会显示
至此为 JUnit 5 与 Mockito 2 工作扫清了一个障碍。可是刚刚偶然间用 Java 10 跑了一下
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
mockito-junit-jupiter 来迎接它。在 Mockito 2.1.0 的 What's new in Mockito 2 中记述了 JUnit 5 为 Mockito 2 开发了一个 MockitoExtension。追溯到 Mockito 2 的 Release Notes, 我们发现 Mockito 2 官方最早引入 MockitoExtension 的版本是 2.16.3(2018-03023)。我对 Mockito 对 JUnit 5 支持的最新更新是从这个 Pull Request MockitoExtension for JUnit5 得知的。
一句话讲就是现在的 Mockito 2 有原生态的 MockitoExtension 来支援 JUnit 5, 可以非常放心可靠的让 JUnit 5 和 Mockito 2 一起稳定工作。因此前面那个包名带
example 字样的 MockitoExtension 链接也就无效了。下面来体验一下那个 MockioExtension,测试当中需要的依赖包含
junit-jupiter-engine 和 mockito-junit-jupiter 1<dependency>
2 <groupId>org.junit.jupiter</groupId>
3 <artifactId>junit-jupiter-engine</artifactId>
4 <version>5.2.0</version>
5 <scope>test</scope>
6</dependency>
7<dependency>
8 <groupId>org.mockito</groupId>
9 <artifactId>mockito-junit-jupiter</artifactId>
10 <version>2.18.3</version>
11 <scope>test</scope>
12</dependency>都取了当前在 Maven 中央仓库的最新版本。
在 IntelliJ IDEA 2018.1.3 版本中运行接下来的测试用例,连
jnit-jupiter-engine 都可以不要,看来 IntelliJ IDEA 自带了 jupiter-api 实现。Maven 命令可不行,而且 Maven 还要插件依赖 junit-platform-surefire-provider 才能执行。首先我们要有一个被测试类 UserService
1public class UserService {
2 private List<String> users;
3
4 public UserService(List<String> users) {
5 this.users = users;
6 }
7
8 public void addUser(String name) {
9 users.add(name);
10 }
11}然后创建它的测试用例 UserServiceTest
1package cc.unmi;
2
3import org.junit.jupiter.api.DisplayName;
4import org.junit.jupiter.api.Test;
5import org.junit.jupiter.api.extension.ExtendWith;
6import org.mockito.InjectMocks;
7import org.mockito.Mock;
8import org.mockito.junit.jupiter.MockitoExtension;
9
10import java.util.List;
11
12import static org.mockito.Mockito.times;
13import static org.mockito.Mockito.verify;
14
15@ExtendWith(MockitoExtension.class)
16public class UserServiceTest {
17
18 @Mock
19 private List<String> users;
20
21 @InjectMocks
22 private UserService userService;
23
24 @Test
25 @DisplayName("Should add a user to list")
26 public void shouldAddUserToList() {
27 userService.addUser("hello");
28
29 verify(users, times(1)).add("hello");
30 }
31}JUnit 5 下只能用
@ExtendWith, 找不到 @RunWith 了,虽然 MockitoJUnitRunner 还在,可它是为 JUnit 4 准备的。在 IntelliJ IDEA 中运行该测试
一切工作正常,方法被 Mock, Mock 对象自动被注入,@DisplayName 也正常显示若要用
mvn test 在控制台下运行测试用例,还要为 maven-surefire-plugin 加上一个内部依赖,在 pom.xml 文件中 1<build>
2 <plugins>
3 <plugin>
4 <artifactId>maven-surefire-plugin</artifactId>
5 <version>2.21.0</version>
6 <dependencies>
7 <dependency>
8 <groupId>org.junit.platform</groupId>
9 <artifactId>junit-platform-surefire-provider</artifactId>
10 <version>1.2.0</version>
11 </dependency>
12 </dependencies>
13 </plugin>
14 </plugins>
15</build>然后执行控制台命令
$ mvn test
控制台下仍然是不会显示 @DisplayName 指定的描述。至此为 JUnit 5 与 Mockito 2 工作扫清了一个障碍。可是刚刚偶然间用 Java 10 跑了一下
mvn test 来运行这个例子,出问题了,Java 8, 9 相继被 Oracle 放弃了,离 Java 10 真会越来越远了。
永久链接 https://yanbin.blog/junit-5-work-with-mockito-2/, 来自 隔叶黄莺 Yanbin's Blog[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。