본문 바로가기
개발공부 개발새발/JAVA

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

by 휴일이 2023. 7. 1.

 

Junit5 를 사용하는 service 를 테스트 해보자!

 

< 패스워드 변경을 성공하는 테스트를 만들 예정이다 >

 

 

 

참고로 난 스프링 3.0, JAVA 17을 사용중이므로

junit5 를 사용 중이다 !

스프링부트 3.0 을 사용하면 junit5 가 자동으로 의존성 추가되고

junit5 를 사용하면 요런 애들이 같이 들어간다

 

그럼 코드를 찬찬히 살펴본다 !

 

 

 

package today.also.hyuil.service.member;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import today.also.hyuil.domain.member.*;
import today.also.hyuil.exception.MemberNotFoundException;
import today.also.hyuil.exception.NotValidException;
import today.also.hyuil.repository.member.MemberJpaRepository;
import today.also.hyuil.service.member.inter.MemberJoinService;

import java.util.Date;

import static org.assertj.core.api.Assertions.assertThat;

// module 이 여러개여서 인텔리제이가 오류를 띄움
@SpringBootTest
class MemberJoinServiceImplTest {

    @Autowired
    private MemberJoinService memberJoinService;

    @Autowired
    private MemberJpaRepository memberJpaRepository;

    @BeforeEach
    void clean() {
        memberJpaRepository.deleteAll();
    }

    // 패스워드 업데이트
    @Test
    @DisplayName("패스워드 변경시 성공처리")
    void pw_update_success() throws NotValidException, MemberNotFoundException {
        // given -> Nullable 한 컬럼은 굳이,,,
        Member member = getMember();
        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);
    }

    private Member getMember() {
        Address address = new Address();
        Member member = Member.builder()
                .memberId("memberId")
                .password("password!123")
                .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;
    }

}

 

 

 

 

@SpringBootTest
class MemberJoinServiceImplTest {

    @Autowired
    private MemberJoinService memberJoinService;

    @Autowired
    private MemberJpaRepository memberJpaRepository;

테스트 클래스 위에 @SpringBootTest 애노테이션을 붙여주고

내가 사용할 클래스들에 의존성 자동 주입을 해준다

 

 

일단 Junit4 를 사용했던 때와 다르게 Junit5 부터는 @springBootTest 만 써도 테스트가 가능하다

 

스프링 부트 3.1 도큐먼트에서 보면 Junit5 를 사용하는 사람들은 @SpringBootTest 만 사용하면 test 를 실행할 수 있기 때문이다!!

 

 

 

 

    @BeforeEach
    void clean() {
        memberJpaRepository.deleteAll();
    }

 

그리고 @BeforeEach 를 사용해서 새로운 테스트가 실행되기 전

모든 데이터를 삭제해주는 로직을 실행시킨다.

그러면 깨끗해진 DB에서 안전한 테스트를 할 수 있겠죠? ^_^

 

 

 

참고로 Junit5 에서 사용할 수 있는 테스트용 애노테이션은 여러가지가 있는데

이건 간단하게 모든 테스트 메서드 실행 전에 실행되어야 할 메서드라고 정해주는 애노테이션임 ! !

 

 

 

그러면 테스트를 한번 작성해보쟈 ~~^___^

    @Test
    @DisplayName("패스워드 변경시 성공처리")
    void pw_update_success() throws NotValidException, MemberNotFoundException {
        // given -> Nullable 한 컬럼은 굳이,,,
        Member member = getMember();
        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 메서드는 머냐면

 

 

테스트 메서드 위에 작성하는 애노테이션으로

쉽게 말해 이게 어떤 테스트인지 설명해주는, 테스트 이름을 정하는 애노테이션이다

최대한 자세히 적어주는 것이 좋다고 한다~

 

그리고 테스트 메서드는 언더바( _ ) 사용이 가능하기 때문에 _ 를 붙여서 더 쉽게 알아볼 수 있도록 써준다,

 

 

 

        // given
        Member member = getMember();
        member = memberJoinService.joinMember(member);

 

일단 테스트는 given -> when -> then 순서로 작성한다

내가 테스트할 때 바탕이 되어야하는 상황을 만들고 -> 테스트 로직이 실행되고 -> 이 결과가 어떻게 되는지 ! !

 

나는 일단 가입 된 멤버가 있어야 패스워드를 변경할 수 있으니 멤버를 가입 시킨다 ^___^

 

 

 

        // when -> Pw change
        String newPwd = "Pwd123SSdsa";
        memberJoinService.passwordChange(member.getId(), "password!123", newPwd);
        Member findMember = memberJpaRepository.findById(member.getId()).orElse(null);

 

진짜 패스워드 로직을 실행시킨다.

memberJoinService에 있는 passwordChange() 로직을 실행시킨다

그리고 잘 변경 되었는지 멤버 id 를 이용해 DB 에 저장되어 있는 멤버를 가져온다

 

저 가운데에 들어가는 "password!123" 은 회원가입 된 멤버의 원래 패스워드다.

 

    private Member getMember() {
        Address address = new Address();
        Member member = Member.builder()
                .memberId("memberId")
                .password("password!123")
                .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;
    }

 

 

 

        // then -> Assertion
        assertThat(findMember).isNotNull();
        assertThat(findMember.getPassword()).isEqualTo(newPwd);

그리고 Assertions.assertThat() 메서드로 검증한다.

일단 가져온 멤버가 널이 아닌지(제대로 가입되어 있는지) 확인 후

가져온 멤버의 패스워드가 newPwd 와 일치하는지 확인한다.

 

 

그러면 결과는?

 

 

 

예쁜 초록색이 뜨며 성공적으로 passed 된 것을 볼 수 있다 ^____^ 야호 !

728x90