java - 使用 Mockito Junit 测试异常类型
问题描述
大家好,我对 spring-boot 和 Junit Mockito 完全陌生,我正在尝试检查我的方法是否引发了正确的异常 下面是我的服务类中的方法
public Optional<User> getUserByEmail(String emailaddress) {
System.out.println("From DB");
Optional<User> user = userDao.findByEmailAddress(emailaddress);
user.orElseThrow(() -> new BadRequestException("User Not Found"));
return user;
}
以下是我的测试方法
@Test
@DisplayName("TextCase to check if We are able to get Correct User")
public void getUserByEmailExceptionTest() {
Mockito.when(userDao.findByEmailAddress("mokal006@gmail.com"))
.thenThrow(UserNotFoundException.class);
assertThrows(UserNotFoundException.class, () -> {
LibraryUserDetailsService.getUserByEmail("mokal006@gmail.com");
});
}
现在,即使我在实际方法中抛出了错误的异常,这个测试也通过了。
解决方案
要了解为什么您的测试用例通过了错误的异常类型,请检查assertThrows
内部工作原理。AssertThrows.java
try {
// execute lambda expression passed in assertThrows
} catch (Throwable var5) {
if (expectedType.isInstance(var5)) {
// if type matches returns the exception back
return var5;
}
// ..
// Else throws different exception
throw new AssertionFailedError(message, var5);
}
JUnit 5 检查异常调用的类型,即使抛出的异常属于父类型Class.isIntance(..)
,也会返回 true。Class.isInstance(..)
在您的情况下,抛出的异常很可能是父类型。
您可以通过断言 on 来修复它Class
。
Throwable throwable = assertThrows(Throwable.class, () -> {
LibraryUserDetailsService.getUserByEmail("mokal006@gmail.com");
});
assertEquals(UserNotFoundException.class, throwable.getClass());
或使用此处的解决方案JUnit 5: How to assert an exception is throwed?
[编辑]
正如johanneslink在评论中指出的那样,user.orElseThrow
将永远不会被执行。userDao.findByEmailAddress(...)
将抛出UserNotFoundException
,因为没有catch
块异常将传播回调用者,因此BadRequestException
不会被抛出并且测试用例将始终通过。
推荐阅读
- python - 使用 Windows 身份验证通过 Python 登录发送邮件
- ios - 合并:发布者有时会失去价值并完成
- vue.js - 一个接一个地用 axios 发布请求 Vuejs
- python - 并排绘制两个图形
- android - 使用 iOS 等浏览器从 Android 获取 IMEI
- javascript - 通过 Websockets 从 Python Flask 服务器连续向客户端发送数据
- laravel - Laravel 6 - undefined 不是有效的时间戳。格式必须为 YYYY-MM-DD 或 YYYY-MM-DD hh:mm
- android - 无法使用适用于 Android 的 Google Fit 跟踪位置 (TYPE_LOCATION_SAMPLE)
- javascript - 如何将本地 json 文件数据导入我的 JavaScript 变量?
- angular - 导入自定义库时出现编译错误