<aside> 📌 데이터 엑세스 계층에서의 테스트를 작성할 때에는 항상 DB의 상태를 테스트 실행 이전 상태로 되돌려 놓는 작업을 해야 한다.
</aside>
테스트 케이스의 경우 실행 순서가 보장되지 않는다. 또한 각각의 테스트는 독립적이기 때문에 서로에게 영향을 주어서도 안된다. 따라서 데이터 엑세스 계층에서 테스트를 작성할 때에는 DB를 테스트 이전 상태로 유지할 수 있도록 테스트 시 삽입,수정한 데이터들을 모두 삭제하는 작업이 필요하다.
package com.codestates.slice.repository.member;
import com.codestates.member.entity.Member;
import com.codestates.member.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
public class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@Test
public void saveMemberTest() {
// given
Member member = new Member();
member.setEmail("[email protected]");
member.setName("홍길동");
member.setPhone("010-1111-2222");
// when
Member savedMember = memberRepository.save(member);
// then
assertNotNull(savedMember);
assertTrue(member.getEmail().equals(savedMember.getEmail()));
assertTrue(member.getName().equals(savedMember.getName()));
assertTrue(member.getPhone().equals(savedMember.getPhone()));
}
}
@DataJpaTest
@Transactional
을 메타 정보로 가지고 있으므로 각각의 테스트가 끝날 때마다 rollback을 자동으로 해준다.DataSource
정보를 테스트용 in-memory DB로 바꾸어 설정해준다. 따라서 휘발성이 있는 데이터로 안전하게 테스트를 진행할 수 있다. 이 설정을 바꾸고 싶다면 @AutoConfigureTestDatabase
을 오버라이딩해서 세팅하면 된다.spring.jpa.show-sql
속성이 true
로 설정되어 있다면 테스트 로그도 출력된다. showSql
속성 값을 바꾸어 설정을 바꿀 수도 있다.@WebMvcTest
처럼 데이터 계층 이외에 다른 컴포넌트의 설정은 배제하므로 애플리케이션 전체의 컨텍스트가 필요한 경우 @SpringBootTest
와 @AutoConfigureTestDatabase
조합을 사용하는 것이 바람직하다.@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(DataJpaTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled =false)
@TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public@interface DataJpaTest {
}