SpringBoot 유닛테스트 - 3

박찬규·2023년 7월 8일

GoodJobProject

목록 보기
3/9

이번에는 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");
    }
}
  1. MemberService는 PasswordEncoder 객체에 의존하는 클래스이다.
    MemberServiceTest에서 @InjectMocks 를 사용하여 MemberService 객체를 생성하고,@Mock을 사용하여 PasswordEncoder mock객체를 생성한다.
  2. MockitoAnnotations.openMocks(this)를 통해 목 객체를 초기화하고, MemberService.join()을 호출하여 예상된 결과를 검증한다.

여기서

	@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단 유닛테스트를 작성하면서 익숙해져야겠다.

0개의 댓글