Spring 강의/section6
[20강]
Anoi
2023. 2. 5. 15:14
스프링 통합 테스트
스프링 컨테이너와 db까지 연결한 통합 테스트를 진행해보자.
테스트쪽에서 MemberServiceTest를 복사해 MemberServiceIntergrationTest를 만든다.
MemberServiceIntergrationTest.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package hello.hellospring2.service;
import hello.hellospring2.domain.Member;
import hello.hellospring2.repository.MemberRepository;
import hello.hellospring2.repository.MemoryMemberRepository;
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 static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
class MemberServiceIntergrationTest {
@Autowired //필드 인젝션
MemberService memberService;
@Autowired
MemberRepository memberRepository;
//현재 스프링에서 등록되어 있는 구현체, SpringConfig한 데서 올라올 거다.
@Test
void join() {
//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());
}
|
cs |
스프링 테스트이기 때문에 @SpringBootTest를 적어준다.
원래는 생성자 인젝션으로 하는 게 좋지만 테스트 코드는 다른 곳에 갖다 쓸 게 아니므로 필드 인젝션, 즉 가장 편한 방법으로 해도 괜찮다.
그리고 실행을 돌려보면 이전과 다르게 스프링이 뜬다.
그리고 db에 들어간 것을 확인할 수 있다.
이렇게 되면 test를 여러 개 돌릴 때 서로 영향을 받을 수밖에 없다.
그래서 지난번에는 @Aftereach로 그때그때 다 지워준 건데
스프링테스트에서는 @Transcational로 그 문제를 해결할 수 있다.
자바에서 쿼리를 작성하고 커밋을 해야 db에 들어가는데
@Transactional이 그 전에 롤백을 해주기 때문에 db에 들어가지 않는다.
우선 db에 들어있는 데이터들을 지우자.
그리고 같은 이름의 "hello"를 넣어서 다시 돌려보자.
실행시켜보면 db에 들어온 값이 없으므로 같은 이름의 회원으로 test를 여러번해도 오류 나지 않는다.
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactioanl : 테스트 케이스에 이 어노테이션이 있으면,
테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다.
이렇게 하면 db에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
이렇게 되면 다 스프링 테스트로 하면 되지, 자바 테스트는 필요없는 거 아닌가?
속도면에서는 자바테스트가 월등하다.
그러므로 단위 테스트를 잘 만들어서 자바테스트로 돌리는 연습을 하는 것이 중요하다.