이번에는 memberSerivce에서 회원가입 성공 로직을 테스트해보려고 한다.
테스트 구현에 앞서 어느정도까지 테스트 코드를 짜야하는지 알아본 결과,
일반적으로 memberController등 controller 테스트는 보통 통합테스트로 진행하고,
memberService 등 service테스트는 pulbic 메소드만 유닛테스트를 진행한다고한다.
나도 이 방식대로 테스트 코드를 구현해보려고 한다.
@ExtendWith(MockitoExtension.class)
class MemberServiceTest {
@Spy
private PasswordEncoder passwordEncoder;
@Mock
private MemberRepository memberRepository;
@InjectMocks
private MemberService memberService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
@DisplayName("일반 회원가입 성공")
void joinSuccess() {
// GIVEN
JoinRequestDto joinRequestDto = new JoinRequestDto();
joinRequestDto.setUsername("test");
joinRequestDto.setPassword("1234");
joinRequestDto.setConfirmPassword("1234");
joinRequestDto.setNickname("tester");
joinRequestDto.setEmail("test@naver.com");
// WHEN
RsData<Member> rsData = memberService.join(joinRequestDto);
// THEN
assertThat(rsData.getResultCode()).isEqualTo("S-1");
assertThat(rsData.getData().getUsername()).isEqualTo("test");
assertThat(rsData.getData().getUserRole()).isEqualTo("free");
}
}
여기서
@Spy
private PasswordEncoder passwordEncoder;
@Mock
private MemberRepository memberRepository;
테스트 메서드에서 직접 사용하지 않는 목 객체를 설정해준 이유는 memberService.join() 메서드에서 해당 객체를 사용하기 때문이다.
아래는 MemberService.join()의 코드이다.
@Transactional
public RsData<Member> join(JoinRequestDto joinRequestDto) {
RsData canJoinData = canJoin(joinRequestDto);
if (canJoinData.isFail()) { // 회원가입 불가능할 경우
return canJoinData;
}
String password = passwordEncoder.encode(joinRequestDto.getPassword());
String nickname = joinRequestDto.getNickname().replaceAll("\\s+", "");
Member member = genMember(joinRequestDto.getUsername(), password, nickname, joinRequestDto.getEmail(), "GOODJOB");
memberRepository.save(member);
return RsData.of("S-1", "%s님의 회원가입이 완료되었습니다.".formatted(joinRequestDto.getNickname()), member);
}
이렇게 회원가입 성공 로직을 작성해봤다.
테스트코드작성이 익숙치 않아서 이 코드도 꽤 시간이 걸렸는데,
service단 유닛테스트를 작성하면서 익숙해져야겠다.