模拟保存 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);