Модульный тест В Spring Boot значение объекта изменяется после установки? - PullRequest
2 голосов
/ 06 июня 2019

Я только начал писать тесты для своего проекта Spring Boot.

@Test
public void updatePassword_SetNewPasswordForQuizUser() throws QuizUserNotFoundException {
    QuizUser oldQuizUser = this.quizUserService.getQuizUserId("SmitShah");
    System.out.println(oldQuizUser);
    QuizUser updated = new QuizUser("SmitShah", "SmitPassword2", 
            true, false, false, 
            "");
    QuizUser updatedQuizUser = this.quizUserService.updateQuizUser(updated);
    System.out.println(updatedQuizUser);
    assertThat(updatedQuizUser.getPassword()).isNotEqualTo(oldQuizUser.getPassword());
}

oldQuizUser в моем тесте содержит:

new QuizUser("SmitShah", "SmitPassword", true, false, false, "");

Вывод oldQuizUser содержит:

QuizUser{QuizUserId='SmitShah', Password='SmitPassword', IsAdmin=true, IsActive=false, IsOnline=false, Avatar='', createDateTime=null}

После вызова метода updateQuizUser() вывод updatedQuizUser содержит:

QuizUser{QuizUserId='SmitShah', Password='$2a$10$fuVy.orndbmsgRQJptH5Se9iTTTI9EBhakwMFgmFrPqVdtcKCIPHq', IsAdmin=true, IsActive=false, IsOnline=false, Avatar='', createDateTime=null}

Как видите, oldQuizUser содержит открытый текстовый пароль, а updatedQuizUser содержит хешированный пароль.

Однако утверждение в конце моего теста не удается. После отладки кажется, что после запуска updateQuizUser() значение oldQuizUser меняется на обновленное.

Почему это происходит?

Это соответствующие части из QuizUserService, которые вызываются в ходе теста:

@Override
public QuizUser updateQuizUser(QuizUser user) throws QuizUserNotFoundException {
    if(this.quizUserRespository.findById(user.getQuizUserId()).isPresent()) {
        QuizUser oldUser = this.quizUserRespository.findById(user.getQuizUserId()).get();
        if (user.getAvatar() != null) oldUser.setAvatar(user.getAvatar());
        if (user.getPassword() != null) oldUser.setPassword(pe.encode(user.getPassword()));
        if (user.isAdmin()) oldUser.setAdmin(user.isAdmin());
        this.quizUserRespository.save(oldUser);
        return oldUser;
    }
    else{
        throw new QuizUserNotFoundException();
    }
}


@Override
public QuizUser getQuizUserId(String id) throws QuizUserNotFoundException {
    if(this.quizUserRespository.findById(id).isPresent()){
        return this.quizUserRespository.findById(id).get();
    }
    else{
        throw new QuizUserNotFoundException();
    }
}

1 Ответ

1 голос
/ 06 июня 2019

Поскольку объекты совпадают в контексте постоянства, при его обновлении ссылка также обновляется.

Альтернативой для проверки будет:

    @Test
    public void updatePassword_SetNewPasswordForQuizUser() throws QuizUserNotFoundException {
        QuizUser oldQuizUser = this.quizUserService.getQuizUserId("SmitShah");
        String oldPassword = oldQuizUser.getPassword();
        QuizUser updated = new QuizUser("SmitShah", "SmitPassword2", 
                true, false, false, 
                "");
        QuizUser updatedQuizUser = this.quizUserService.updateQuizUser(updated);
        assertThat(updatedQuizUser.getPassword()).isNotEqualTo(oldPassword);
    }
...