有没有办法检查JUnit5和Mockito是否使用了局部变量方法?

v09wglhw  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(145)

我有用户实体的服务类。其中一种方法负责更改用户密码。这就是问题所在。方法在数据库中查找用户并将其存储在局部变量中。很明显,它是有效的,但是有没有一种方法可以写一个测试来检查用户类中的密码设置方法是否被使用了?

public AuthenticationResponse changeUserPassword(ChangeUserPasswordDto changeUserPasswordDto,
            String jwtToken)
            throws RuntimeException
{
        User user = userRepository.findByEmail(jwtUtil.extractUsername(jwtToken)).get();

        if (!passwordEncoder.matches(changeUserPasswordDto.getPassword(),user.getPassword()))
            throw new InvalidPasswordException("Old password is not matching.");
        if (!changeUserPasswordDto.getNewPassword().equals(changeUserPasswordDto.getNewPasswordConfirmation()))
            throw new NotMatchingPasswordsException("Passwords are not matching.");

        user.setPassword(passwordEncoder.encode(changeUserPasswordDto.getNewPassword()));
        user.setLastCredentialsChangeTime(System.currentTimeMillis());
        return AuthenticationResponse.builder().token(jwtUtil.generateToken(userRepository.save(user))).build();
}

我已经找了半天这个问题的解决方案,但我发现只有one可疑的解决方案使用Powermock library,但这个库还没有从去年更新。
没有可能使用Mockito.verify()或其他东西,因为它在外部不可见。
为这样的东西编写测试有意义吗?

6yt4nkrj

6yt4nkrj1#

我认为有两种最简单的方法来验证密码是否被更改:
1.使用从模拟存储库返回的对象的getter。它是同一个对象示例,所以如果它在测试方法内部被修改,我们可以看到在测试中调用方法之后:

@Test
void userWithGetter() {
    var email = "email@example.com";
    var password = "admin123";
    var user = new User();
    when(userRepository.findByEmail(email))
            .thenReturn(Optional.of(user));

    testedClass.changeUserPassword(email, password);

    assertEquals(password, user.getPassword());
}

1.类似地,但如果User类没有密码的getter,我们可以监视从模拟存储库返回的对象,以验证setter调用:

@Test
void userWithoutGetter() {
    var email = "email@example.com";
    var password = "admin123";
    var user = spy(new User());
    when(userRepository.findByEmail(email))
            .thenReturn(Optional.of(user));

    testedClass.changeUserPassword(email, password);

    verify(user).setPassword(password);
}

我准备了a GitHub repository,其中包含了在测试中重现您的类的缩短代码,并包含了上面描述的测试--两者都通过了。如果需要进一步澄清,我很乐意帮忙。

相关问题