2015-01-24 2 views
4

저는 다중 모듈 스프링 - 부트 프로젝트를 가지고 있습니다. Spring Data JPA 리포지토리를 테스트하기 위해 어떻게 통합 테스트를 설정할 수 있는지 궁금합니다. 다음 예외가이 예외와 함께 실패합니다. HV000183 : 'javax.el.ExpressionFactory'를로드 할 수 없습니다. 클래스 경로에 EL 종속성이 있는지 확인하십시오.스프링 - 부트 모듈 기반 통합 테스트

이 모듈은 웹 모듈에 의존하지 않으므로 시작할 수있는 웹 응용 프로그램이 없습니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@IntegrationTest 
@SpringApplicationConfiguration(classes = TestConfiguration.class) 
class CardInfoRepositoryIT { 

    @Autowired CardInfoRepository cardInfoRepository; 

    @Test 
    void testLoadData() { 
     assert cardInfoRepository.findAll().size() == 1 
    } 

} 
+0

작성한 임의의 구성이 아닌 응용 프로그램 클래스를 SpringApplicationConfiguration 주석에 사용해야합니다. 또한'@ Integrationtest'도 정말로 필요합니까? 따라서 RestTemplate을 사용하여 응용 프로그램을 테스트 할 수 있도록 응용 프로그램을 시작합니다. 이것은 당신이하고 있거나 필요로하는 것처럼 보이지 않습니다. –

+0

1) 응용 프로그램 클래스를 사용할 수 없습니다.이 모듈은 웹 모듈 (웹 모듈은 응용 프로그램 클래스를 포함합니다)에 의존합니다. 2) 리포지토리 테스트를 위해 RestTemplate이 필요한 이유는 무엇입니까? 이것은 웹 또는 웹 서비스 통합 테스트가 아닙니다. – led

+0

'@ IntegrationTest'는 실제로 무엇을 이해합니까? 당신이하려고하는 것으로 판단 할 때 스프링 부트의 의미에서 통합 테스트와 아무런 관련이 없습니다. 통합 테스트가 아니라 저장소에 대한 단위 테스트를 작성하는 중입니다. –

답변

11

예를 들어, 임베디드 톰캣에 배포 , Jetty 또는 Undertow 컨테이너). 따라서 리포지토리 계층을 독립적으로 테스트하는 것이 목표 인 경우 @IntegrationTest을 사용하지 않아야합니다.

반면에 테스트에 특정 스프링 부트 기능 (표준 스프링 프레임 워크 기능, 의미 및 기본값과 달리)이 필요한 경우 실제로는 @ContextConfiguration 대신 @SpringApplicationConfiguration이라는 테스트 클래스에 주석을 추가하려고합니다. 이유는 @SpringApplicationConfiguration이 스프링 부트에만 해당하는 SpringApplicationContextLoader을 미리 구성하기 때문입니다. 당신이 당신의 저장소 계층의 통합 테스트가 더 빨리 실행하려면

또한, (즉, 봄 부팅의 전체 오버 헤드없이), 그 의지 자동 구성 모든 후보 이후 @EnableAutoConfiguration 주석 구성 클래스를 제외하도록 선택할 수 있습니다 classpath에 자동 구성이 있습니다. 예를 들어 Spring Boot가 엔티티 스캐닝과 함께 임베디드 데이터베이스와 Spring Data JPA (JPA 프로 바이더로서의 Hibernate 포함)를 자동 구성하고자한다면 다음과 같이 테스트 구성을 구성 할 수 있습니다 :

@Configuration 
@EnableJpaRepositories(basePackageClasses = UserRepository.class) 
@EntityScan(basePackageClasses = User.class) 
@Import({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) 
public class TestRepositoryConfig {} 

그리고 다음과 같이 테스트 클래스에 해당 구성을 사용

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = TestRepositoryConfig.class) 
@Transactional 
public class UserRepositoryTests { /* ... */ } 

감사합니다,

샘에게

추신 다음의 유용한 질문에 대한 답을 찾을 수있을 것입니다. Disable security for unit tests with spring boot

+0

자세한 설명을 주셔서 감사합니다. 이것이 제가 처음에 알고 싶었던 것입니다. – led

0

다음 테스트 구성 클래스를 사용하여이 문제를 해결했습니다.

@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
@PropertySource("classpath:core.properties") 
class TestConfiguration { 
} 

core.properties는 주 응용 프로그램에서도 사용되며 데이터 소스 정보를 포함합니다. @IntegrationTest 주석은 테스트 클래스에서 제거 될 수 있습니다.

는 또한 의존성과 모듈에 다음을 추가 :

마틴이 언급 ​​한 바와 같이 당신이 (배포 봄 부팅 응용 프로그램에 대해 테스트 할 필요가있을 때, @IntegrationTest에만 사용해야합니다
testRuntime 'javax.el:javax.el-api:2.2.4' 
testRuntime 'org.glassfish.web:javax.el:2.2.4'