
이전 글에서 JDBC로 DB와 연결을 하고 확인을 해봤었다.
이번에는 DB까지 사용해서 진행하는 통합 테스트를 만들어 볼 것이다.
이전에 만들었던 테스트 코드를 복사해서 조금 수정해주었다.
// service/MemberServiceIntegrationTest.java
package hello.hello_spring.service;
import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import org.assertj.core.api.Assertions;
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.assertThrows;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void join() {
Member member = new Member();
member.setName("hello");
long saveId = memberService.join(member);
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void duplicateNameCheck() {
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
@SpringBootTest 어노테이션을 사용하면 스프링 부트의 애플리케이션 컨텍스트를 로드하여 실제 애플리케이션과 유사한 환경에서 테스트를 수행할 수 있다.
그리고 @Transactional 어노테이션을 테스트 케이스에서 사용하면 AfterEach 없이도 자동으로 ROLLBACK되어 DB 상태를 테스트 전후로 일관되게 유지시켜 준다고 한다.


테스트가 문제없이 끝나고 DB도 이전과 동일한 상태를 유지하는 것을 볼 수 있다.
다만 테스트 결과를 보면 빨간 텍스트가 한 줄 출력된다.
무언가 문제가 있는 것 같아 이를 찾아보았다.
빨간 텍스트의 전문은 아래와 같다.
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
이는 Java Virtual Machine 실행 시 나타날 수 있는 일반적인 경고 중 하나라고 한다.
클래스 데이터 공유가 부트로더 클래스로만 제한되어 있다는 내용이다.
주로 성능 최적화를 위한 기능에 대한 경고일 뿐, 애플리케이션 실행에는 큰 문제가 되지 않는다고 한다.