例如,我在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();
}
型
我有下一个逻辑:
1.测试开始
User dbUser = userRepository.findOne(userDto.getId());
dbUser = NULLif (dbUser != null
)和if (oneByLogin != null)
跳过
1.创建新用户并设置数据User savedUser = userRepository.save(newUser);
savedUser = 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
呢?
5条答案
按热度按时间f45qwnt81#
你必须这么做
字符串
现在你可以获取user,并将其作为参数传递。
e0bqpujr2#
您可以执行以下操作:
字符串
使用这种方法,你只需要确保你的
mockedUserRepository
被注入到你的测试类中(例如,在构造函数中)。yuvru6vn3#
您需要编写多个测试用例来测试不同的场景。
场景1:当findOne返回非空对象时:
字符串
场景二:findOneByLogin返回null对象:
型
场景二:保存完成时:
@测试
型
r6hnlfcb4#
关于如何创建JPA存储库
save
方法,为@GeneratedValue
字段生成随机ID,我只说两句。字符串
因此,这里您将所需的存储库作为参数传递,并且方法为所有使用
@GeneratedValue
annotation注解的字段调用enrichGeneratedValueField
。下面是此方法的实现:型
在这个例子中,我只使用了
Integer
类型的ID,但是可以自由地添加你想要的ID类型。7fhtutme5#
要验证保存是否成功,也可以尝试以下操作
字符串