우선 기능적으로도 부족한게 많지만.. 깔끔한 코드와 객체지향적인 코드를 만들어 다음 유지보수에도 도움이 되도록 만들려고 한다.
TDD 방식은 우선 테스트 코드를 만들고 그리고 코드를 구현하는 방식을 말하는데.. 이미 코드가 구현되어 있으니 구현된 코드를 참고하지 않고 그냥 테스트 코드를 먼저 만들고 구현된 코드를 수정하는 방식으로 진행하겠다.
테스트 코드는 Junit5를 사용해서 작성했다.
현재는 단위테스트를 진행하고 있기에 Mockito를 사용하였다.
우선 UserSerivce 클래스 먼저 적용시켜 보겠다.
TDD방법을 적용해 테스트 코드에서 먼저 작성하고 코드를 보면서 수정하려고 했지만 처음 적용해 보는거여서 그런지 쉽지 않았다. 그래서 우선 코드를 보면서 테스트 코드를 작성해 보았다.
@Test
void register() {
// given
String loginId = "id";
String name = "name";
String nickname = "test";
String email = "test@test.com";
String loginPassword = "pw";
int age = 1;
String gender = "man";
UserJoinRequestDto userJoinRequestDto = UserJoinRequestDto.builder()
.loginId("id")
.name("name")
.nickname("test")
.email("test@test.com")
.loginPassword("pw")
.age(1)
.gender("man")
.build();
// when
usersService.register(userJoinRequestDto);
Users users = usersRepository.findByNickname("test").orElseThrow(() ->
new IllegalArgumentException("해당 닉네임의 유저가 없습니다.")
);
// then
assertEquals(loginId, users.getLoginId());
assertEquals(name, users.getName());
assertEquals(nickname, users.getNickname());
assertEquals(email, users.getEmail());
assertEquals(age, users.getAge());
assertEquals(gender, users.getGender());
boolean passwordMatches = passwordEncoder.matches(loginPassword, users.getLoginPassword());
assertTrue(passwordMatches);
}
코드는 단순 비교 테스트이다.
물론 초록 막대 !!
이제는 중복된 체크 테스트를 작성할 차례이다.
만약에 이미 동일한 이메일, 아이디, 닉네임이 있다면 json 형식으로 에러코드와 가입이 불가능하다는 메시지를 받을 수 있게 체크해야한다.
그럼 테스트 코드를 3개를 작성하면 된다.
이메일 중복 확인 테스트, 아이디 중복확인 테스트, 닉네임 중복확인 테스트
만들다 보니 유효성을 검증하는 클래스가 따로 있었으면 좋겠어서 조금 수정했다.
@Test
public void 이메일_중복_확인_테스트() {
// Given
UserJoinRequestDto userJoinRequestDto = UserJoinRequestDto.builder()
.email("test@example.com")
.build();
Mockito.when(usersRepository.existsByEmail("test@example.com")).thenReturn(true);
// When
Errors errors = new BeanPropertyBindingResult(userJoinRequestDto, "userJoinRequestDto");
registerValidator.validate(userJoinRequestDto, errors);
// Then
assertTrue(errors.hasErrors());
assertEquals("이메일 중복", errors.getFieldError("email").getDefaultMessage());
}
우선 dto에 이메일을 설정해 주고
Mockito.when(usersRepository.existsByEmail("test@example.com")).thenReturn(true);
를 통해 저 이메일이 들어오면 true를 반환하게 설정한다.
그리고 validate를 통해 확인하면 끝!
이 코드를 위해 vaildator 클래스, 예외처리 클래스 등 다양하게 만들었는데 다음 포스트에서 설명하겠다.
아이디와 닉네임 역시 동일한 방법으로 테스트 코드를 작성했다.
@Test
public void 아이디_중복_확인_테스트() {
// Given
UserJoinRequestDto userJoinRequestDto = UserJoinRequestDto.builder()
.loginId("test")
.build();
Mockito.when(usersRepository.existsByLoginId("test")).thenReturn(true);
// When
Errors errors = new BeanPropertyBindingResult(userJoinRequestDto, "userJoinRequestDto");
registerValidator.validate(userJoinRequestDto, errors);
// Then
assertTrue(errors.hasErrors());
assertEquals("아이디 중복", errors.getFieldError("loginId").getDefaultMessage());
}
@Test
public void 닉네임_중복_확인_테스트() {
// Given
UserJoinRequestDto userJoinRequestDto = UserJoinRequestDto.builder()
.nickname("test")
.build();
Mockito.when(usersRepository.existsByNickname("test")).thenReturn(true);
// When
Errors errors = new BeanPropertyBindingResult(userJoinRequestDto, "userJoinRequestDto");
registerValidator.validate(userJoinRequestDto, errors);
// Then
assertTrue(errors.hasErrors());
assertEquals("닉네임 중복", errors.getFieldError("nickname").getDefaultMessage());
}
아직은 테스트 코드를 작성하고 실제 코드를 작성하는 것은 익숙하지 않다. 그래서 반대로 우선 먼저 적용해 보았는데 그래도 쉽지는 않았다.
더 나은 코드를 위해 테스트 코드 작성 -> 실제코드 작성 형식으로 연습해 보려고 한다.