问题是您要测试的事物是什么?
如果您想测试您的存储库,您可以使用 Springs @DataJpaTest 来实现。见Integration Testing With @DataJpaTest
如果您想测试 makeUserActive-Method 中的逻辑,您必须确保模拟您的存储库。
假设包含您的makeUserActive-Method 的服务看起来像这样:
public class UserService{
private final UsersJpaRepository usersJpaRepository;
public UserService(UsersJpaRepository usersJpaRepository) {
this.usersJpaRepository = usersJpaRepository;
}
public void makeUserActive(long userId){
// your code from your question
}
}
你可以这样写你的单元测试:
@Test
void makeUserActiveTest(){
UsersJpaRepository repository = new InMemoryUsersJpaRepository();
UserEntity user = new UserEntity();
user = repository.save(user);
UserService service = new UserService(repository);
service.makeUserActive(user.getId());
Optional<UserEntity> activatedUser = repository.findById(user.getId());
assertTrue(activatedUser.isPresent());
assertEquals(1, activatedUser.get().isActive());
}
InMemoryUsersJpaRepository 是一个自写的 Mock,它将所有数据存储在内部 Map 中。代码可能如下所示:
public class InMemoryUsersJpaRepository extends UsersJpaRepository {
private Map<Long, UserEntity> users = new HashMap<>();
private Long idCounter = 1L;
@Override
public UserEntity save(UserEntity user) {
if(user.getId() == null){
user.setId(idCounter);
idCounter++;
}
users.put(user.getId(), user);
return user;
}
@Override
public Optional<UserEntity> findById(long userId) {
return Optional.of(users.get(userId));
}
}
这样您将测试您的 makeUserActive-Method 的逻辑,该方法目前只是在您的 UserEntity 上设置 isActivated 标志。
另外,我想提醒您有关 Mensur Qulami 的 answer。
他回答中的代码将导致通过测试,但我很确定它不会测试您想要测试的东西。
您应该始终测试您的方法的预期和可观察行为。
在您的情况下,这将是应为 1 的 isActivated 标志。
您的makeUserActive-Method 调用UsersJpaRepository 的findById 和save 方法这一事实仅仅是实现细节,对这些方法的测试通常会导致脆弱的测试。