스프링 통합 테스트

이전에 만들었던 리포지토리는 디비까지 연결이 됩니다. 그렇다면 테스트도 스프링까지 올리고 DB까지 연결한 통합 테스트를 진행해보겠습니다.

이전까지 테스트는 순수한 자바코드로 만든 테스트였습니다. 그런데 순수한 자바 코드로 JdbcMemberRepository 테스트 코드를 작성할 수 없습니다. DB 커넥션도 스프링 부트가 들고 있기 때문입니다. 이제부터는 테스트를 스프링과 엮어서 하겠습니다.

test폴더의 service 패키지에 MemberServiceIntegrationTest 클래스를 만듭니다.

Untitled

...

//...1
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

		//...2
    @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
    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("이미 존재하는 회원입니다.");
    }
}
  1. @SpringBootTest와 @Transactional를 적어줘야합니다.

    자세한 것은 뒤에서 설명하겠습니다.

  2. 이제는 스프링 컨테이너에게 MemberService, MemberRepository 내놓으라고 해야 합니다. 그러니 beforeEach()메서드는 필요 없습니다.

    앞에서 테스트코드를 작성할 때는 생성자(Constructor)를 가지고 Injection 했지만, Test는 제일 끝단에 있기 때문에 가장 편한 방법을 사용하면 됩니다.

    그렇기에 그냥 필드 주입으로 넣어버리는 방식을 많이 사용합니다. Test를 다른 곳에서 갖다 쓸 것이 아니라 Test에서만 Injection 받아서 사용하고 끝이기 때문입니다.

    그리고 앞의 테스트와는 다르게 MemoryMemberRepository memberRepository;가 아니라 MemberRepository memberRepository;가 되어야합니다.

    이 이유는 스프링에서 구현체로 등록 되어있는게 MemoryMemberRepository에서 JdbcMemberRepository로 바뀌었기 때문입니다. 그래서 MemoryMemberRepository 타입으로 받아올 수 없습니다.

  3. 다음 테스트에 영향을 주지 않도록 저장공간을 비워주는 afterEach() 메서드도 삭제합니다. @Transactional 때문에 필요가 없기 때문입니다.

    자세한 것은 뒤에서 설명하겠습니다.

이제 테스트 코드 실행을 해봅시다. 우선 회원가입() 메서드 부터 돌려봅시다.

Untitled

에러가 발생합니다. 이유는 이미 spring이 디비에 있는데 테스트도 spring으로 받았기 때문입니다.

그러니 디비를 싹 지워줍시다.

delete from member