java - 如何在单元测试中模拟 JPA 存储库的保存方法
问题描述
例如,我在 UserService 中有这个方法:
@Override
@Transactional
public UserDto create(UserDto userDto) {
User dbUser = userRepository.findOne(userDto.getId());
if (dbUser != null) {
throw new AuthException(AuthException.ErrorCode.DUPLICATE_USER_EXCEPTION);
}
User oneByLogin = userRepository.findOneByLogin(userDto.getLogin());
if (oneByLogin != null) {
throw new AuthExceptionAuthException.ErrorCode.DUPLICATE_LOGIN_EXCEPTION);
}
User newUser = new User();
newUser.setGuid(UUID.randomUUID().toString());
newUser.setInsertDate(new Date());
newUser.setFirstName(userDto.getFirstName());
newUser.setLastName(userDto.getLastName());
newUser.setLogin(userDto.getLogin());
newUser.setPassword(userDto.getPassword());
newUser.setAuthToken(TokenGenerator.nextToken());
newUser.setAuthTokenCreatedDate(new Date());
User savedUser = userRepository.save(newUser);
userDto.setAuthToken(savedUser.getAuthToken());
log.info("User {0} created", savedUser.getLogin());
return userDto;
}
如何为此方法创建单元测试?我接下来尝试了:
@Test
public void createUser() {
UserDto userDtoRequest = new UserDto();
userDtoRequest.setLogin("Alex");
userDtoRequest.setPassword("123");
UserDto found = userService.create(userDtoRequest);
assertThat(found.getAuthToken()).isNotEmpty();
}
我有下一个逻辑:
- 测试开始
User dbUser = userRepository.findOne(userDto.getId());
dbUser = NULLif (dbUser != null
) 并if (oneByLogin != null)
跳过- 创建新用户并设置数据
User savedUser = userRepository.save(newUser);
已保存用户 = NULL
在这一步,我有一个问题,因为我不能模拟userRepository.save(newUser)
.
newUser create inside the method. and test fail.
savedUser.getAuthToken() - savedUser == NULL
我可以重写:
userRepository.save(newUser);
userDto.setAuthToken(newUser.getAuthToken());
log.info("User {0} created", newUser.getLogin());
return userDto;
但是如果我想使用返回的对象savedUser
呢?
解决方案
你需要这样做。
when(userRepository.save(Mockito.any(User.class)))
.thenAnswer(i -> i.getArguments()[0]);
现在您可以获得作为参数传递的用户。
推荐阅读
- vue.js - 配置postcss.config.js(主要是tailwndcss)的具体规则是什么?
- intellisense - 让 Specflow Intellisense 只显示一个步骤定义而不是所有过去的变化
- r - 在 BQ 中使用带有 WHERE 语句的表属性进行选择
- django - pythonanywhere.com 上我的 django 项目中 /email/signup/ 的 SMTPAuthenticationError
- python - 如何撤消我在 Pycharm 的调试模式下所做的更改?
- amazon-redshift - 编辑后删除了 Redshift 预定查询
- javascript - 可能的内存泄漏 - Javascript Watchers,用于动画数据的动态 CSS 变量
- javascript - 如何在 SharePoint 类中使用客户 HTML/CSS?
- vue.js - 在现有的 vue 3 应用程序中集成流星
- ios - 如何在我的 SwiftUI 应用程序中初始化我的 ViewModel