-
테스트 코드 - 회원 관리 예제 실습(스프링 통합 테스트)테스트코드(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이 됩니다.
즉, 다음 테스트에 영향을 주지 않습니다.
'테스트코드(Test Code)' 카테고리의 다른 글
인수테스트란 무엇인가? (0) 2023.12.28 Mock 프레임워크란? (+ Mockito 프레임워크 사용 예시) (0) 2022.05.13 Mock 객체란? (0) 2022.03.15 테스트 커버리지? 코드 커버리지란? (0) 2022.03.07 테스트 코드 걸음마 떼기 - 은행 계좌 클래스 만들기 (0) 2022.03.03