스프링 공부/게시판 프로젝트 만들기

[스프링] 14. Member에 대한 테스트 만들기

장아장 2023. 1. 11. 14:02

Member에 대한 테스트를 만들어보아야 겠다. 

 

일단, Member 생성자에 RegisterRequestDto를 넣을 것이다. 

그러기 위해, 테스트를 위한 RegisterRequestDto를 생성하주자. 

private RegisterRequestDto makeTestRegister(){
    return new RegisterRequestDto("username", "nickname", "email@email.com"
            , "password", "password");
}

 

AllArgsConstructor로 모든 인스턴스를 넣은 Dto를 만들었다. 

이를 @Builder를 이용해 조금 더 깔끔하게 만들어보았다. 

 

@AllArgsConstructor
@Data
@Builder
public class RegisterRequestDto 

이런식으로 @Builder를 넣어

private RegisterRequestDto makeTestRegister(){
    return RegisterRequestDto.builder()
            .username("username")
            .nickname("nickname")
            .email("email@email.com")
            .password("password")
            .passwordCheck("password")
            .build();
}

이런식으로 코드를 수정할 수 있다. 

 

// 회원가입 테스트
@Test
@DisplayName("회원가입상의 문제가 없을 경우, 회원가입이 진행된다. ")
void registerTest(){
   assertThatThrownBy(()->new Member(makeTestRegister()))
           .doesNotThrowAnyException();
}

@Test
@DisplayName("이메일 형식이 올바르지 않을 경우 예외처리된다. ")
void notRightEmailFormat(){
    RegisterRequestDto registerRequestDto = makeTestRegister();
    registerRequestDto.setEmail("wrongEamail");
    assertThatThrownBy(()-> new Member(registerRequestDto))
            .isInstanceOf(EmailNotFormatException.class);
}

@Test
@DisplayName("비밀번호와 비밀번호 확인이 다를 경우 회원가입에 예외가 발생된다.")
void notSamePasswordRegister(){
    RegisterRequestDto test = makeTestRegister();
    test.setPasswordCheck("wrong");
    assertThatThrownBy(()-> new Member(test))
            .isInstanceOf(PasswordNotMatchingException.class);
}

아직 Member 도메인에 대한 테스트를 만드는 중이기 때문에, repository에서 데이터를 가져와 테스트하는 과정을 추가하진 않았다.(서비스에서 추가 예정)

회원가입시에 확인할 수 있는 경우는, 이메일 형식과 비밀번호 일치 여부이기 때문에 이에 대한 예외를 처리했다. 

 

// 닉네임 변경 테스트
@Test
@DisplayName("닉네임을 수정하면, 변경된 닉네임이 나온다. ")
void changeNicknameTest(){
    Member member = new Member(makeTestRegister());
    member.changeNickname(new ChangeNicknameRequestDto("newNickname"));
    assertThat(member.getNickname()).isEqualTo("newNickname");
}

@Test
@DisplayName("기존의 닉네임으로 닉네임을 수정하면 예외처리된다.")
void changeSameNickname(){
    Member member = new Member(makeTestRegister());
    assertThatThrownBy(()->member.changeNickname(new ChangeNicknameRequestDto("nickname")))
            .isInstanceOf(NicknameAlreadyInUseException.class);
}

닉네임을 수정할 경우, 수정된 닉네임으로 인스턴스가 초기화되어 불러올 시에도 바뀐 값으로 나오는지 확인하는 테스트이다. 

기존의 닉네임으로 바꿀 경우 예외처리시켰다. 

 

// 이메일 변경 테스트
@Test
@DisplayName("이메일을 수정하면, 변경된 이메일이 나온다. ")
void changeEmailTest(){
    Member member = new Member(makeTestRegister());
    member.changeEmail(new ChangeEmailRequestDto("newEmail@email.com"));
    assertThat(member.getNickname()).isEqualTo("newEmail@email.com");
}

@Test
@DisplayName("기존의 이메일로 이메일을 수정하면 예외처리된다. ")
void changeSameEmail(){
    Member member = new Member(makeTestRegister());
    assertThatThrownBy(()->member.changeEmail(new ChangeEmailRequestDto(member.getEmail())))
            .isInstanceOf(EmailAlreadyInUseException.class);
}

@Test
@DisplayName("수정하려는 이메일의 형식이 올바르지 않으면 예외처리한다. ")
void emailNotFormat(){
    Member member = new Member(makeTestRegister());
    assertThatThrownBy(()->member.changeEmail(new ChangeEmailRequestDto("wrong")))
            .isInstanceOf(EmailNotFormatException.class);
}

이메일은 기존과 같을 때, 형식이 맞지 않을 때, 정상적으로 변경 가능 할 때 3가지 경우가 있기에 이에 대한 테스트를 추가했다. 

 

@Test
@DisplayName("비밀번호를 정상적으로 수정하면, 성공되고, 로그인시 다른 비밀번호로 로그인해야한다. ")
void changePasswordTest(){
    Member member = new Member(makeTestRegister());
    ChangePasswordRequestDto changePasswordRequestDto = new ChangePasswordRequestDto("newP", "newP");
    assertThatThrownBy(()-> member.changePassword(changePasswordRequestDto))
            .doesNotThrowAnyException();
}

@Test
@DisplayName("비밀 번호수정시, 두번 쓴 비밀번호가 서로 다르면 예외처리한다.  ")
void passwordNotMatch(){
    Member member = new Member(makeTestRegister());
    ChangePasswordRequestDto changePasswordRequestDto = new ChangePasswordRequestDto("newP", "mextP");
    assertThatThrownBy(()-> member.changePassword(changePasswordRequestDto))
            .isInstanceOf(PasswordNotMatchingException.class);
}

@Test
@DisplayName("비밀번호가 이전에 사용하던 비밀번호와 같으면 예외처리한다.")
void passwordFormalSame(){
    Member member = new Member(makeTestRegister());
    ChangePasswordRequestDto changePasswordRequestDto = new ChangePasswordRequestDto("password", "password");
    assertThatThrownBy(()-> member.changePassword(changePasswordRequestDto))
            .isInstanceOf(PasswordNotChangedException.class);
}

비밀번호는 서로 같지 않을 때, 이전과 같을 때, 정상변경 가능할 때 3가지를 테스트로 만들었다. 

 

public Member(RegisterRequestDto registerRequestDto){

}

public void changeNickname(ChangeNicknameRequestDto changeNicknameRequestDto){

}

private boolean isNicknameSameWithFormal(ChangeNicknameRequestDto changeNicknameRequestDto){
    return false;
}

public void changeEmail(ChangeEmailRequestDto changeEmailRequestDto){

}

private boolean isEmailSameWithFormal(ChangeEmailRequestDto changeEmailRequestDto){
    return false;
}

public void changePassword(ChangePasswordRequestDto changePasswordRequestDto){

}

private boolean isPasswordNotSame(ChangePasswordRequestDto changePasswordRequestDto){
    return false;
}

private boolean isPasswordSameWithFormal(ChangePasswordRequestDto changePasswordRequestDto){
    return false;
}

private boolean isPasswordOutdated(){
    return false;
}

 

이에 대한 실패하는 메서드를 만들었다. 

이제 이를 하나씩 작동시키는 과정을 정리해야겠다.