Spring, Apache, Java

[Spring] Integration Test 코드 예시

cwchoiit 2023. 10. 16. 11:03
728x90
반응형
SMALL
728x90
반응형
SMALL

DB와 연동된 서비스 로직의 코드를 테스트할 필요가 반드시 생기는데, 이렇게 서비스 로직뿐 아니라 DB와 연동성도 정상적으로 이루어지는지까지 확인하는 테스트를 일반적으로 통합테스트 (Integration Test)라 한다. Spring에서 통합테스트 하는 방법은 굉장히 간단하다.

 

@SpringBootTest, @Transactional 어노테이션을 사용하면 된다.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
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.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
     @Autowired MemberService memberService;
     @Autowired MemberRepository memberRepository;
     
     @Test
     public void 회원가입() throws Exception {
     //Given
     Member member = new Member();
     member.setName("hello");
     
     //When
     Long saveId = memberService.join(member);
     
     //Then
     Member findMember = memberRepository.findById(saveId).get();
     assertEquals(member.getName(), findMember.getName());
 }

모든 DB는 사실 어떤 작업을 하고 그 행위에 대한 '커밋'이 이루어져야 DB에 반영되어 Persist 속성을 가지게 되는데, 이처럼 @Test 라는 어노테이션에 @Transactional 어노테이션이 붙어버리면 커밋을 하지 않고 '롤백'을 한다. 하나의 트랜잭션에서 이루어지는 모든 DB와 관련된 작업이 롤백되는 것이다. 물론 이 @Transactional 어노테이션이 @Test가 아닌 다른 서비스에서 붙으면 자동으로 커밋이 되는데 @Test 어노테이션은 그렇지 않다. @Commit 이라는 어노테이션이 없으면 롤백이 기본이다. 

 

따라서, DB와 연동되는 서비스의 테스트를 간단하게 수행할 수 있다. 또한 이 테스트 코드에서 보다시피 필드 주입을 통해 DI를 수행했다. 

 

근데 수행해보면 알겠지만, @SpringBootTest는 SpringBoot가 띄워지기 때문에 속도 차이도 엄청 난다. 그래서 이렇게 특수한 경우에는 어쩔수 없지만 그렇지 않은 경우 순수 자바코드로 테스트 코드를 짜는게 효율적인 것과 동시에 더 좋은 테스트일 확률이 높다. 

728x90
반응형
LIST