Spring Data JPA 의 reposcory 테스트

15689 단어 springjpa
Spring Data JPA 의 reposcory 테스트
Spring Data JPA 의 reposcory 는 모두 인터페이스 인 데 어떻게 테스트 합 니까?
이 글 은 이 문제 에 대답 하고 우 리 는 선택 TodoRepository 중의 findBySearchTerm() 방법 을 예 로 들 었 다.
maven 의존 가 져 오기
의존 하 는 pom 파일 은 다음 과 같 습 니 다:
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.2.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.1.6.RELEASE</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.dbunit</groupId>
    <artifactId>dbunit</artifactId>
    <version>2.5.1</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.github.springtestdbunit</groupId>
    <artifactId>spring-test-dbunit</artifactId>
    <version>1.2.1</version>
    <scope>test</scope>
</dependency>

통합 테스트 에 필요 한 환경 설정
구성 통합 테스트
절 차 는 다음 과 같다.
  • SpringJUnit4ClassRunner 을 통 해 테스트 를 실행 합 니 다. 이것 은 Spring Test 프레임 워 크 가 JUnit 에 대해 맞 춤 형 운행 기 입 니 다. @RunWith 를 통 해 설정
  • application context 를 설정 하고 @ContextConfiguration 주 해 를 통 해 이 루어 집 니 다
  • test execution listeners 를 설정 합 니 다. 이 를 통 해 Spring Test framework 가 테스트 수행 에서 발표 한 이 벤트 를 설정 하려 면 다음 과 같은 listener 를 설정 해 야 합 니 다.
  • DependencyInjectionTestExecutionListener 테스트 대상 에 의존 주입 제공
  • TransactionalTestExecutionListener 사무 지원
  • DbUnitTestExecutionListener Spring Test DbUnit 에 포 함 된 특성
  • 제공

    설정 후의 설정 클래스 는 다음 과 같 습 니 다:
    import com.github.springtestdbunit.DbUnitTestExecutionListener;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.TestExecutionListeners;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
    import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {PersistenceContext.class})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
            TransactionalTestExecutionListener.class,
            DbUnitTestExecutionListener.class})
    public class ITFindBySearchTermTest {
    }

    자세 한 내용 은 각 종류의 자바 독 을 알 수 있 습 니 다.
    다음은 Spring Data JPA 의 reposcory 에 테스트 를 쓸 수 있 습 니 다.
    Spring Data JPA 의 reposcory 를 위 한 테스트 쓰기
    절 차 는 다음 과 같다.
    우선, 테스트 할 reposcory 를 주입 합 니 다. 코드 는 다음 과 같 습 니 다.
    import com.github.springtestdbunit.DbUnitTestExecutionListener;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.TestExecutionListeners;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
    import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {PersistenceContext.class})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
            TransactionalTestExecutionListener.class,
            DbUnitTestExecutionListener.class})
    public class ITFindBySearchTermTest {
    
        @Autowired
        private TodoRepository repository;
    }

    그리고 테스트 데 이 터 를 초기 화하 기 위해 DbUnit 의 dataset 를 만 듭 니 다. XML 형식의 dataset 파일 을 사용 합 니 다. 파일 은 다음 과 같은 특징 을 가지 고 있 습 니 다.
  • 모든 XML 요 소 는 table 의 한 줄 을 대표 합 니 다
  • 모든 XML 요소 의 태그 명 표 의 이름
  • 모든 XML 요소 의 속성 은 필드 를 표시 합 니 다
  • 우리 의 dataset 파일 은 다음 과 같 습 니 다.
    <dataset>
        <todos id="1" created_by_user="createdByUser" creation_time="2014-12-24 11:13:28" description="description" modified_by_user="modifiedByUser" modification_time="2014-12-25 11:13:28" title="title" version="0"/>
        <todos id="2" created_by_user="createdByUser" creation_time="2014-12-24 11:13:28" description="tiscription" modified_by_user="modifiedByUser" modification_time="2014-12-25 11:13:28" title="Foo bar" version="0"/>
    </dataset>

    DbUnit 의 dataset 의 더 많은 형식 은 DbUnit dataset formats 를 보십시오.
    그리고 테스트 를 작성 합 니 다. 절 차 는 다음 과 같 습 니 다.
  • 주 해 를 통 해 dataset
  • 을 설정 합 니 다.
  • 테스트 를 작성 하여 확인 @DatabaseSetup 방법 은 'iTl' 을 매개 변수 로 조회 할 때 대상 을 되 돌려 줍 니 다
  • 테스트 를 작성 하여 확인 findBySearchTerm() 방법 은 'iTl' 을 매개 변수 로 조회 할 때 id 가 1 인 대상
  • 을 되 돌려 줍 니 다.findBySearchTerm() 코드 는 다음 과 같다.
    import com.github.springtestdbunit.DbUnitTestExecutionListener;
    import com.github.springtestdbunit.annotation.DatabaseSetup;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.TestExecutionListeners;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
    import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {PersistenceContext.class})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
            TransactionalTestExecutionListener.class,
            DbUnitTestExecutionListener.class})
    @DatabaseSetup("todo-entries.xml")
    public class ITFindBySearchTermTest {
    
        @Autowired
        private TodoRepository repository;
    
        @Test
        public void findBySearchTerm_TitleOfFirstTodoEntryContainsGivenSearchTerm_ShouldReturnOneTodoEntry() {
            List<Todo> searchResults = repository.findBySearchTerm("iTl");
            assertThat(searchResults).hasSize(1);
        }
    
        @Test
        public void findBySearchTerm_TitleOfFirstTodoEntryContainsGivenSearchTerm_ShouldReturnFirstTodoEntry() {
            List<Todo> searchResults = repository.findBySearchTerm("iTl");
    
            Todo found = searchResults.get(0);
            assertThat(found.getId()).isEqualTo(1L);
        }   
    }
    ITFindBySearchTerm 주의해 야 할 두 가지 가 있다.
  • 테스트 클래스 의 모든 테스트 용례 가 하나의 dataset 를 사용 하면 @DatabaseSetup 주해 표를 클래스 에 표시 할 수 있 습 니 다. 그렇지 않 으 면 방법
  • 에 표시 해 야 합 니 다.
  • dataset 파일 과 테스트 클래스 가 같은 가방 에 있 으 면 파일 의 이름 을 직접 쓸 수 있 습 니 다. 한 가방 에 없 으 면 todo - entries. xml 파일 이 foo. bar 가방 에 있 으 면 '/ foo / bar / todo - entries. xml'
  • 을 써 야 합 니 다.
    확장 읽 기
  • Writing Tests for Data Access Code 는 깨끗 하고 유지 가능 한 데이터베이스 테스트 코드 를 어떻게 쓰 는 지 설명 했다
  • Spring From the Trenches: Using Null Values in DbUnit Datasets 는 DbUnit 의 dataset 에서 null 값 을 어떻게 사용 하 는 지, 왜 사용 하 는 지 설명 했다
  • Spring From the Trenches: Resetting Auto Increment Columns Before Each Test Method 는 테스트 방법 이 실행 되 기 전에 자동 으로 증가 하 는 열 을 리 셋 하 는 방법
  • 을 설명 했다.
    총결산
    요약:
  • Spring Test DbUnit 을 통 해 DbUnit 과 Spring Test framework 를 진행 했다
  • Spring Test DbUnit 과 Spring Test framework 를 @DatabaseSetup 통 해 통합
  • XML 로 DbUnit 을 작성 하 는 dataset 파일
  • 을 배 웠 습 니 다.
  • 사용 DbUnitTestExecutionListener 주해
  • 를 배 웠 다.
    P. S. 프로젝트 코드 는 Github (query methods, JPA Criteria API, Querydsl) 에서 가 져 올 수 있 습 니 다.
    더 많은 Spring Data JPA tutorial 튜 토리 얼 을 방문 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기