Mockito 和 JUnit 5 – 使用 ExtendWith
最后更新:2017 年 10 月 29 日
1. 概述
在本快速教程中,我们将展示 如何将 Mockito 与 JUnit 5 扩展模型集成。 要了解更多关于 JUnit 5 扩展模型的信息,请参阅这篇文章 文章。
首先,我们将展示如何创建一个扩展,该扩展会自动为任何带有 @Mock 注解的类属性或方法参数创建 mock 对象。
然后,我们将使用我们的 Mockito 扩展在 JUnit 5 测试类中。
2. Maven 依赖
让我们将 JUnit 5 (jupiter) 和 mockito 依赖项添加到我们的 pom.xml 文件中
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
可以从 Maven Central 下载 junit-jupiter-engine 和 mockito-core 的最新版本。
3. Mockito 扩展
Mockito 在库 – mockito-junit-jupiter 中提供了 JUnit5 扩展的实现。
我们将此依赖项包含在我们的 pom.xml 文件中
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.12.0</version>
<scope>test</scope>
</dependency>
4. 构建测试类
让我们构建我们的测试类并将 Mockito 扩展附加到它
@ExtendWith(MockitoExtension.class)
class UserServiceUnitTest {
UserService userService;
// ...
}
我们可以使用 @Mock 注解来注入一个实例变量的 mock,可以在测试类中的任何地方使用该 mock
@Mock UserRepository userRepository;
我们还可以将 mock 对象注入到方法参数中
@BeforeEach
void init(@Mock SettingRepository settingRepository) {
userService = new DefaultUserService(userRepository, settingRepository, mailClient);
lenient().when(settingRepository.getUserMinAge()).thenReturn(10);
when(settingRepository.getUserNameMinLength()).thenReturn(4);
lenient().when(userRepository.isUsernameAlreadyExists(any(String.class)))
.thenReturn(false);
}
请注意这里使用了 lenient()。Mockito 在未通过测试方法之一调用初始化的 mock 对象时,会在执行期间抛出 UnsupportedStubbingException。 我们可以通过在使用时使用此方法来避免这种严格的桩检查。
我们甚至可以将 mock 对象注入到测试方法参数中
@Test
void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) {
// Given
user = new User("Jerry", 12);
when(userRepository.insert(any(User.class))).then(new Answer<User>() {
int sequence = 1;
@Override
public User answer(InvocationOnMock invocation) throws Throwable {
User user = (User) invocation.getArgument(0);
user.setId(sequence++);
return user;
}
});
userService = new DefaultUserService(userRepository, settingRepository, mailClient);
// When
User insertedUser = userService.register(user);
// Then
verify(userRepository).insert(user);
assertNotNull(user.getId());
verify(mailClient).sendUserRegistrationMail(insertedUser);
}
请注意,我们作为测试参数注入的 MailClient mock 将不会与我们在 init 方法中注入的实例相同。
5. 结论
Junit 5 提供了一个很好的扩展模型。 我们演示了一个简单的 Mockito 扩展,它简化了我们的 mock 创建逻辑。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















