2016-08-30 3 views
1

데이터베이스와의 몇 가지 간단한 작업을 포함하는 단위 테스트가 있습니다. 데이터베이스와의 상호 작용은 Spring Data 및 JPA로 구현됩니다. 내 환경은 Spring Boot 1.4입니다.Unit/Integration 테스트에서 스프링 부트 데이터/JPA 레이어 만 데이터베이스와로드

응용 프로그램는 봄 부팅 진입 점이며, EnableAutoConfiguration 주석이 포함
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 
@SpringBootTest(classes = {Application.class}) 
@Transactional 
public class OrderRepositoryTest { 
    @Autowired 
    private OrderRepository orderRepository; 

    @Autowired 
    EntityManager entityManager; 

    @Test 
    public void can_create_and_find_one_order() { 
     String orderId = "XX_YY"; 

     Order order1 = createAnOrder(); 
     orderRepository.save(order1); 

     entityManager.flush(); 
     entityManager.clear(); 

     Order order2 = orderRepository.findOne(orderId); 
     Assertions.assertThat(order2).isEqualTo(order1); 
    } 
} 

:

@EnableAutoConfiguration 
@EnableConfigurationProperties 
@ComponentScan(basePackageClasses = { 
    WebMvcConfig.class, 
    ServicesConfiguration.class, 
    WebSecurityConfiguration.class 
}) 
public class Application extends SpringBootServletInitializer { 
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) { 
     return applicationBuilder.sources(Application .class); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

JPA에 층을로드 않습니다 테스트를

내 시험은 아래와 같다 작업을 수행합니다. 또한 MVC 구성, 보안 구성 및 테스트하지 않는 다른 많은 계층도로드합니다.

질문 : EnableAutoConfiguration을 어떻게 바꾸고 필요한 JPA 레이어 만로드 할 수 있습니까?

@Configuration 
@EnableJpaRepositories(basePackages = "class.path.to.my.repositories") 
public class PersistenceConfiguration { 
    // Whatever needs to be here 
    // ... 
} 

답변

2
:

이상적으로, 그것은, 내가 단위 테스트 및 응용 프로그램의 진입 점에서 사용할 수있는 방법으로 'WebMvcConfigurerAdapter'을 확장 유사한 구성 클래스 그래서 내 단위 테스트는 구성의 유효성을 검사 할

JPA 계층을 테스트하려는 경우에만 @DataJpaTest 만 필요합니다. 메모리 내장 데이터베이스를 구성하고 @Entity 클래스를 검색하고 Spring Data JPA 저장소를 구성합니다. 일반 @Component 빈은 ApplicationContext로로드되지 않습니다. 예를 들어

:

Hibernate: drop table blog_entry if exists 
Hibernate: drop table comment if exists 
Hibernate: create table blog_entry (id bigint generated by default as identity, content varchar(255), created_on timestamp, title varchar(255), updated_on timestamp, primary key (id)) 
Hibernate: create table comment (id bigint generated by default as identity, comment varchar(255), blog_entry_id bigint, primary key (id)) 
Hibernate: alter table comment add constraint FK5f23qjwyt0ffjboqu3go58buu foreign key (blog_entry_id) references blog_entry 

...... 

Hibernate: insert into blog_entry (id, content, created_on, title, updated_on) values (null, ?, ?, ?, ?) 
1 

...... 

Hibernate: drop table blog_entry if exists 
Hibernate: drop table comment if exists 
+0

원래 포스터가 트랜잭션 테스트를 원했기 때문에'(propagation = Propagation.NOT_SUPPORTED)'을 삭제하고 테스트 클래스의 이름을 변경해야합니다. 그렇지 않으면 대답이 좋아 보인다. –

+0

@SamBrannen 예, 알림을 보내 주셔서 감사합니다. –

+0

수정없이이 코드를 사용하면'@SpringBootConfiguration을 찾을 수 없다는 오류가 발생합니다. @ContextConfiguration 또는 @SpringBootTest (클래스 = ...)를 테스트와 함께 사용해야합니다' – jmgonet

2
:

@RunWith(SpringRunner.class) 
@DataJpaTest 
@Transactional 
public class SpringBootJPATest { 

    @Autowired 
    private BlogEntryRepository blogEntryRepository; 

    @Autowired 
    private TestEntityManager entityManager; 

    @Test 
    public void jpa_test() { 
     BlogEntry entity = new BlogEntry(); 
     entity.setTitle("Test Spring Boot JPA Test"); 
     BlogEntry persist = entityManager.persist(entity); 
     System.out.println(persist.getId()); 
    } 

    @Test 
    public void jap_test_repo() { 
     BlogEntry entity = new BlogEntry(); 
     entity.setTitle("Test Spring Boot JPA Test"); 
     BlogEntry persist = blogEntryRepository.save(entity); 
     System.out.println(persist.getId()); 
    } 
} 

BlogEntryRepositoryJpaRepository

출력을 확장 단지 빈 인터페이스 (I 다른 정보를 로그 단지 모든 절전 로그를 남겨 삭제)

언급 한대로 spring-boot document으로, @DataJpaTest을 사용하면 수집 방법입니다. 아래 코드를 사용해보세요. 저에게 도움이됩니다.

@RunWith(SpringRunner.class) 
@Import(PersistenceConfiguration.class) 
@ContextConfiguration(classes = YourOrderRepositoryImpl.class) 
@DataJpaTest 
@Transactional 
public class OrderRepositoryTest { 
    @Autowired 
    private OrderRepository orderRepository; 

    @Autowired 
    TestEntityManager entityManager; 

    @Test 
    public void foo() { 
    ... 
    } 
} 

사용 @DataJpaTest 또한 임대에 하나의 config (설정) 할 @ContextConfiguration를 사용할 필요가 봄을 관리하기 콩을, 그렇지 않으면 오류 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test을 얻을 것이다.

TestEntityManager 대신 EntityManager을 사용할 수 있습니다. 문서도 there입니다.

관련 문제