ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 테스트 코드 - 회원 관리 예제 실습(스프링 통합 테스트)
    테스트코드(Test Code) 2022. 4. 24. 15:26

    이전에 했던 test는 순수하게 자바로 진행했지만 DB 정보들을 Spring이 가지고 있기 때문에 스프링과 함께 통합 테스트를 진행해야 합니다.

     

    1. test/java/hello.hellospring.service 패키지에 MemberServiceIntegrationTest.java를 생성합니다.

    package hello.hellospring.service;
    
    import static org.junit.jupiter.api.Assertions.assertThrows;
    
    import java.util.List;
    
    import org.assertj.core.api.Assertions;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.transaction.annotation.Transactional;
    
    import hello.hellospring.domain.Member;
    import hello.hellospring.repository.MemberRepository;
    import hello.hellospring.repository.MemoryMemberRepository;
    
    @SpringBootTest
    @Transactional
    public class MemberServiceIntegrationTest {
    	@Autowired MemberService memberService;
    	@Autowired MemberRepository memberRepository;
    
    	
    
    	@Test
    	void 회원가입() {
    		// given
    		Member member = new Member();
    		member.setName("hello");
    
    		// when
    		Long saveId = memberService.join(member);
    
    		// then
    		Member findMember = memberService.findOne(saveId).get();
    		Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
    
    	}
    
    	@Test
    	void 중복회원예외() {
    		// given
    		Member member1 = new Member();
    		member1.setName("hello");
    
    		Member member2 = new Member();
    		member2.setName("hello");
    
    		// when
    		memberService.join(member1);
    		IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    		
    		// then
    		Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.\n");
    
    	}
    
    	@Test
    	void findMembers() {
    		// given
    		Member member1 = new Member();
    		member1.setName("hello1");
    
    		Member member2 = new Member();
    		member2.setName("hello2");
    
    		memberService.join(member1);
    		memberService.join(member2);
    
    		// when
    		List<Member> result = memberService.findMembers();
    
    		// then
    		Assertions.assertThat(result.size()).isEqualTo(2);
    
    	}
    
    	@Test
    	void findOne() {
    		//given
    		Member member = new Member();
    		member.setName("hello");
    				
    		memberService.join(member);
    		Long memberId = member.getId();
    		
    		
    		//when
    		Member result = memberService.findOne(memberId).get();
    				
    		//then
    		Assertions.assertThat(result.getName()).isEqualTo(member.getName());		
    }

     

    @SpringBootTest 어노테이션을 통해 스프링 컨테이너와 함께 테스트를 실행할 수 있도록 해줍니다.

     

    @BeforeEach 부분을 지워줍니다.

    이전에는 객체를 생성해서 직접 넣어줬지만 이제는 스프링 컨테이너에게서 받아와야 합니다.

    이때 생성자를 통해 받아왔었는데 테스트 코드에서는 필드 주입을 통해 받아옵니다.

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    memberRepository 구현체는 SpringConfig로부터 받아옵니다.

     

    @AfterEach 부분을 지워줍니다.

    해당 로직은 다음 테스트를 계속 실행 가능하게 하기 위하여 대번 DB를 지워주는 작업을 했었습니다.

     

    이제 테스트를 실행해보면 실패할 수도 있고 성공할 수도 있습니다.

    만약 이전에 hello라는 회원이 존재한다면 중복회원 예외가 발생하여 실패하게 됩니다.

     

    따라서 DB를 모두 지워주고 테스트를 진행해보겠습니다.

    DELETE FROM MEMBER;

    위의 코드를 H2 콘솔에서 실행하여 DB를 모두 지워줍니다.

     

    이후에 테스트 코드를 돌려보면 정상적으로 잘 동작하는 것을 볼 수 있습니다.

     

    만약 @Transactional 어노테이션이 없다면

    @AfterEach 부분이 없기 때문에

    테스트는 계속 실행 가능해야 하지만 회원가입 테스트를 2번 진행하면 중복회원 예외가 발생하면서 테스트에 실패하게 됩니다.

     

    그러면 @AfterEach를 통해 db를 삭제하는 방법을 사용해도 되겠지만  @Transcational 어노테이션을 통해서 편하게 관리할 수 있습니다.

     

    @Transactional 어노테이션을 통해 테스트가 끝나면 DB의 데이터가 rollback이 됩니다.

    즉, 다음 테스트에 영향을 주지 않습니다.

     

     

    댓글

Designed by Tistory.