[Spring Boot] 스프링부트 (IntelliJ)/Spring boot

[SpringBoot] Junit - @SpringBootTest, @Transactional 어노테이션

류도토리 2024. 3. 4. 17:34

@SpringBootTest
스프링 컨테이너와 테스트를 함께 실행한다

 

@Transactional
테스트할 때 DB에 반영된 것들을 테스트가 끝나면 rollback 해주어
DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

 

테스트 파일을 만들 경우 스프링 컨테이너 없이 '단위테스트'를 하는 것이 좋은 테스트라고 한다.

MemberServiceTest 같은 경우는 단위테스트

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }

    @Test
    void 회원가입() {
        // given - 이 데이터를 기반으로
        Member member = new Member();
        member.setName("hello");

        // when - 이걸 검증함
        Long saveId = memberService.join(member);

        // then - 검증부
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        memberService.join(member1);

        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

        //        try {
//            memberService.join(member2);
//            fail();
//        } catch (IllegalStateException e){
//            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        }

        //then
    }


}

 

MemberServiceIntergrationTest 같이 스프링컨테이너와 DB까지 연동하는 것을 통합테스트라고 한다.

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @Test
    void 회원가입() {
        // given - 이 데이터를 기반으로
        Member member = new Member();
        member.setName("spring");

        // when - 이걸 검증함
        Long saveId = memberService.join(member);

        // then - 검증부
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        memberService.join(member1);

        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

        //then
    }

}