模拟保存 returns 空。找不到区别
Mocked save returns null. Cannot find the difference
我正在使用 Junit 5。
这是我的测试:
@Test
void testCanCreateRefreshToken() {
var usersEntity = UsersEntity.builder().id(7L).username("username").password("thisIsAPassword").build();
var refreshTokensEntity = validRefreshTokensEntity(null, "this.is.token", usersEntity, Instant.now());
var savedRefreshTokensEntity = validRefreshTokensEntity(1L, "this.is.token", usersEntity, Instant.now());
when(usersRepository.findById(7L)).thenReturn(Optional.of(usersEntity));
when(refreshTokensRepository.save(refreshTokensEntity)).thenReturn(savedRefreshTokensEntity);
assertEquals(savedRefreshTokensEntity, refreshTokensService.createRefreshToken(7L));
}
这是方法:
public RefreshTokensEntity createRefreshToken(Long userId) {
RefreshTokensEntity refreshTokensEntity = new RefreshTokensEntity();
refreshTokensEntity.setUsersEntity(usersRepository.findById(userId).get());
refreshTokensEntity.setExpiryDate(Instant.now().plusMillis(refreshTokenDurationMs));
refreshTokensEntity.setToken(UUID.randomUUID().toString());
RefreshTokensEntity saved = refreshTokensRepository.save(refreshTokensEntity);
return saved;
}
System.out.println of refreshTokenEntity
in real method:
RefreshTokensEntity(id=null, token=85c448be-11d2-43c6-8cc4-41f3a68fe4cb, usersEntity=UsersEntity(id=7, username=username, password=thisIsAPassword), expiryDate=2022-02-28T20:13:38.056212944Z)
System.out.println of refreshTokenEntity
测试中:
RefreshTokensEntity(id=null, token=this.is.token, usersEntity=UsersEntity(id=7, username=username, password=thisIsAPassword), expiryDate=2022-02-28T20:13:26.332206931Z)
当然,如果我通过了any()
我就可以验证测试了。
有没有可能是令牌和过期日期的问题?所以,我需要将它们放在外部 class 中并模拟它们...
我为遇到同样问题的人留下我自己的答案。
是的,问题出在 token 和 ExpiryDate 的变量值上。
因此,我创建了两个不同的 类 来操纵它们并将它们用作模拟对象。
所以我可以在每次测试中获得相同的值。
例如:
String refreshToken = "this-is-a-refreh-token";
when(jwtUtils.generateRefreshToken()).thenReturn(refreshToken);
我正在使用 Junit 5。
这是我的测试:
@Test
void testCanCreateRefreshToken() {
var usersEntity = UsersEntity.builder().id(7L).username("username").password("thisIsAPassword").build();
var refreshTokensEntity = validRefreshTokensEntity(null, "this.is.token", usersEntity, Instant.now());
var savedRefreshTokensEntity = validRefreshTokensEntity(1L, "this.is.token", usersEntity, Instant.now());
when(usersRepository.findById(7L)).thenReturn(Optional.of(usersEntity));
when(refreshTokensRepository.save(refreshTokensEntity)).thenReturn(savedRefreshTokensEntity);
assertEquals(savedRefreshTokensEntity, refreshTokensService.createRefreshToken(7L));
}
这是方法:
public RefreshTokensEntity createRefreshToken(Long userId) {
RefreshTokensEntity refreshTokensEntity = new RefreshTokensEntity();
refreshTokensEntity.setUsersEntity(usersRepository.findById(userId).get());
refreshTokensEntity.setExpiryDate(Instant.now().plusMillis(refreshTokenDurationMs));
refreshTokensEntity.setToken(UUID.randomUUID().toString());
RefreshTokensEntity saved = refreshTokensRepository.save(refreshTokensEntity);
return saved;
}
System.out.println of refreshTokenEntity
in real method:
RefreshTokensEntity(id=null, token=85c448be-11d2-43c6-8cc4-41f3a68fe4cb, usersEntity=UsersEntity(id=7, username=username, password=thisIsAPassword), expiryDate=2022-02-28T20:13:38.056212944Z)
System.out.println of refreshTokenEntity
测试中:
RefreshTokensEntity(id=null, token=this.is.token, usersEntity=UsersEntity(id=7, username=username, password=thisIsAPassword), expiryDate=2022-02-28T20:13:26.332206931Z)
当然,如果我通过了any()
我就可以验证测试了。
有没有可能是令牌和过期日期的问题?所以,我需要将它们放在外部 class 中并模拟它们...
我为遇到同样问题的人留下我自己的答案。
是的,问题出在 token 和 ExpiryDate 的变量值上。
因此,我创建了两个不同的 类 来操纵它们并将它们用作模拟对象。
所以我可以在每次测试中获得相同的值。
例如:
String refreshToken = "this-is-a-refreh-token";
when(jwtUtils.generateRefreshToken()).thenReturn(refreshToken);