본문 바로가기
프로젝트/토이 프로젝트) 오늘도 휴일

Service 를 테스트해서 오류를 잡아내다!

by 휴일이 2023. 7. 1.

 

자세한 테스트 방법은

https://hyuil.tistory.com/212

 

Junit5 Test ) Service 를 테스트 해보자!

Junit5 를 사용하는 service 를 테스트 해보자! < 패스워드 변경을 성공하는 테스트를 만들 예정이다 > 참고로 난 스프링 3.0, JAVA 17을 사용중이므로 junit5 를 사용 중이다 ! 스프링부트 3.0 을 사용하면

hyuil.tistory.com

https://hyuil.tistory.com/213

 

Junit5 Test ) Controller 를 테스트 해보자!

이번엔 Controller 를 테스트 해보겠다 Controller 는 HttpServletRequest 도 사용하고 값도 원래는 프론트에서 넣어줘야하는데 어떻게~~~할까용? @SpringBootTest @AutoConfigureMockMvc class MemberInfoControllerTest { @Autowir

hyuil.tistory.com

 

에 나와있다

여기서는 간단하게 내가 어떤 테스트를 진행했는지만 작성하고

실제로 오류를 잡아낸 경험을 작성해보겠음 !

 

 

 

일단 내가 작성한 MemberJoinServiceImplTest

@SpringBootTest
class MemberJoinServiceImplTest {

    @Autowired
    private MemberJoinService memberJoinService;

    @Autowired
    private MemberJpaRepository memberJpaRepository;
    private final String password = "password!123";
    @BeforeEach
    void clean() {
        memberJpaRepository.deleteAll();
    }

    @Test
    @DisplayName("가입 성공 처리")
    void join() {
        // given
        Member member = getMember(password);

        // when
        Member findMember = memberJoinService.joinMember(member);

        // then
        assertThat(findMember).isNotNull();
        assertThat(findMember.getMemberId()).isEqualTo(member.getMemberId());
    }
    @Test
    @DisplayName("memberId 로 멤버를 가져올 때, role 도 가져오는지 검증")
    void findMyAccountMemberId_get_role() {
        // given
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);
        // when
        Member findMember = memberJoinService.findMyAccountMemberId(member.getMemberId());
        // then
        assertThat(findMember.getRole()).isNotNull();
        assertThat(findMember.getRole().getName()).isNotNull();
        assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
    }
    @Test
    @DisplayName("id 로 멤버를 가져올 때, role 도 가져오는지 검증")
    void findMyAccount_get_role() {
        // given
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);
        // when
        Member findMember = memberJoinService.findMyAccount(member.getId());
        // then
        assertThat(findMember.getRole()).isNotNull();
        assertThat(findMember.getRole().getName()).isNotNull();
        assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
    }
    @Test
    @DisplayName("멤버가 가입이 안 되어 있을 때, idPwdValid 를 실행하면 MemberNotFoundException 발생")
    void id_pwd_valid_fail_memberNotFoundException() {
        // given
        Member member = getMember(password);

        // expected
        assertThrows(MemberNotFoundException.class,
                () -> memberJoinService.idPwdValid(member.getMemberId(), member.getPassword()));
    }

    @Test
    @DisplayName("아이디와 패스워드가 맞을 때 true 를 return 하는지 검증")
    void id_pwd_valid_success() throws MemberNotFoundException {
        // given
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);

        // when
        boolean result = memberJoinService.idPwdValid(member.getMemberId(), password);

        // then
        assertThat(result).isTrue();
    }
    @Test
    @DisplayName("아이디와 패스워드가 틀릴 때 false 를 return 하는지 검증")
    void id_pwd_valid_fail() throws MemberNotFoundException {
        // given
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);

        // when
        boolean result = memberJoinService.idPwdValid(member.getMemberId(), password+"123");

        // then
        assertThat(result).isFalse();
    }
    @Test
    @DisplayName("패스워드 변경시 성공 처리")
    void pw_update_success() throws NotValidException, MemberNotFoundException {
        // given -> Nullable 한 컬럼은 굳이,,,
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);

        // when -> Pw change
        String newPwd = "Pwd123SSdsa";
        memberJoinService.passwordChange(member.getId(), "password!123", newPwd);
        Member findMember = memberJpaRepository.findById(member.getId()).orElse(null);
        // then -> Assertion
        assertThat(findMember).isNotNull();
        assertThat(findMember.getPassword()).isEqualTo(newPwd);
    }
    @Test
    @DisplayName("패스워드 변경시 실패 처리")
    void pw_update_fail() throws NotValidException, MemberNotFoundException {
        // given
        Member member = getMember(password);
        Member findMember = memberJoinService.joinMember(member);

        // when -> Pw change
        String newPwd = "Pwd123SSdsa";
        // 가입한 것과 다른 패스워드 줌
        // then -> Assertion
        assertThrows(NotValidException.class, () ->
                memberJoinService.passwordChange(findMember.getId(), "passwor2", newPwd));
    }

    private Member getMember(String password) {
        Address address = new Address();
        Member member = Member.builder()
                .memberId("memberId")
                .password(password)
                .name("name")
                .nickname("nickname")
                .email("email@email.com")
                .phone("01033332222")
                .address(address)
                .role(new Role(Name.ROLE_USER))
                .joinDate(new Date())
                .pwdModifyDate(new Date())
                .sns(Sns.NONE)
                .build();
        return member;
    }

}

 

 

 

나는 여러가지 테스트 케이스를 작성했는데

그 중 내가 오류를 잡았던 케이스는

    @Test
    @DisplayName("id 로 멤버를 가져올 때, role 도 가져오는지 검증")
    void findMyAccount_get_role() {
        // given
        Member member = getMember(password);
        member = memberJoinService.joinMember(member);
        // when
        Member findMember = memberJoinService.findMyAccount(member.getId());
        // then
        assertThat(findMember.getRole()).isNotNull();
        assertThat(findMember.getRole().getName()).isNotNull();
        assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
    }

 

이것이었다

 

아니? 이런 간단한 로직이 왜? 하겠지만

findMyAccount() 메서드를 확인해보면

    @Override
    public Member findMyAccount(Long id) {
        return memberRepository.findByIdRole(id);
    }

findByIdRole 메서드를 사용하고 있다

해당 메서드 안으로 들어가보자

 

 

 

    public Member findByIdRole(Long id) {
        Member member = em.find(Member.class, id);
        member.getRole();
        return member;
    }

이 메서드는 내가 Member 안에 있는 Role 객체를

Poxy 객체가 아닌 진짜 객체로 가져오기 위해 작성했던 메서드다

그래서 member.getRole() 을 해줘서 role 을 같이 가져오려고 했던 건데

 

해당 테스트가 실패하고

세션이 없다는 메시지가 떴다

안이 비어있다는 뜻이겠죠?

 

 

아! 맞다

그 객체를 가져오려면

객체 안에 있는 데이터까지 가져와야 해당 객체가 불러와졌지 참!!!

 

 

    public Member findByIdRole(Long id) {
        Member member = em.find(Member.class, id);
        member.getRole().getName();
        return member;
    }

메서드를 간단하게 수정했고

 

 

 

테스트가 성공하는 것을 볼 수 있다 ! 야호 ~

 

 

 

테스트를 해서 진짜 에러를 잡아내다니

겁내 신기하고 멋진 경험이었음ㅋㅋㅋㅋㅋㅋㅋㅋ캬캬

이래서 테스트를 하는 거구만!~~~

 

 

 

내게 테스트 케이스 작성 방법을 알려준 노란집 개발자님에게

감사하는 부분이구요ㅎ

(아직 답장 안 왓지만 쨌든;;)

 

기분굿 ㅎ

728x90