2017-05-11 5 views
9

inmemory 데이터베이스에서 실행되는 통합 테스트가 있습니다.@Sql이있는 @SpringBootTest : 스크립트 실행 및 컨텍스트 초기화 순서

spring: 
    jpa: 
    hibernate: 
     ddl-auto: create-drop 

내가 SQL 스크립트의 초기화 후에 실행을 기대하십시오 DB 스키마가 Hibernate에 의해 재 작성되는 테스트 컨텍스트 초기화하는 동안

@RunWith(SpringRunner.class) 
@SpringBootTest 
@Sql("/clean-data-in-all-tables.sql") 
public class SomeTest { 
    @Test 
    public void shouldDoSomehting() {} 
} 

: 각 테스트의 서명이 더 많거나 적은 같은 외모 문맥 및 db 스키마 생성 이후. 그러나 어떤 경우에는 clean-data-in-all-tables.sql이 스키마 생성 전에 실행되고 아직 생성되지 않은 테이블을 예상하기 때문에 실패합니다.

필자는 설명 된 방식으로 500 가지 이상의 테스트를 작성했으며 몇 가지 유사한 테스트를 추가 할 때까지 모두 잘 작동했습니다.

Gradle 또는 IntelliJ를 통해 함께 실행하면 테스트가 실패합니다. 실패한 테스트는 최근에 추가 된 테스트가 아닙니다. 이것은 내가 추가 한 테스트와 완전히 관련이없는 오래된 테스트입니다. 또한 이상한 점은을 통해 IntelliJ를 하나씩 실행하면 테스트가 제대로 작동하지 않는다는 것입니다.

스프링 부트의 버그처럼 보입니다.하지만 여전히 해결 방법을 찾으려고합니다. 동시에 나는이 문제를 해결하기 위해 많은 것들을 시도했지만 아무도 도움이되지 못했습니다.

내 코드에 무엇이 잘못 될 수 있는지에 대한 아이디어를 공유하십시오.

UPDATE : 해결 실측치 : createcreate-drop에서 spring.jpa.hibernate.ddl-auto 변화 문제를 해결한다.

그러나 질문은 여전히 ​​열려 있습니다. 이러한 이상한 행동의 이유는 무엇입니까?

+0

새로운 구성을 추가 했습니까? SpringBootTest는 테스트 패키지에서 프로젝트 루트까지 구성을 찾고 있습니다. –

+0

아니요, 새로운 구성을 도입하지 않았으며 기존 구성을 변경하지 않았습니다. –

답변

2

한 가지 가능한 솔루션 (난 당신이하고 DBUnit을 사용 열려 있는지 확실하지 않습니다)가 될 수 있습니다

1) 생성 추상 저장소 통합 테스트 :

@TestExecutionListeners({DbUnitTestExecutionListener.class}) 
@SpringApplicationConfiguration(classes = Application.class) 
@DirtiesContext 
public abstract class AbstractRepositoryIT extends AbstractTransactionalJUnit4SpringContextTests { 
} 

2) 만들기 "진짜" 통합 테스트 :

@DatabaseSetup(SomeEntityRepositoryIT.DATASET) 
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = {"dataset.xml}) 
public class SomeEntityRepositoryIT extends AbstractRepositoryIT { 
... 
} 

파일 dataset.xml에서 당신은 ... 등 당신의 검사 결과에 대한 초기 상태를 설정할 수 있습니다 More can be found here

+0

감사합니다. 불행히도 DbUnit을 사용할 수 없습니다. 기존 테스트 구성의 문제점이 더 중요합니다. –

+0

네, 이해합니다. 그러나 하나의 질문 - SQL 파일은 "clean-data-in-all-tables.sql"이라고 불리며, 테스트 중에 데이터베이스에 삽입 된 모든 데이터를 삭제 (롤백)하는 데 사용됩니까? 어쩌면 당신은 당신이 그것을 필요로하지 않는 해결책으로 끝날 수 있습니까? 테스트 클래스에서 @Transactional을 사용하는 것과 같은 것? – nick79

+0

우리는 DB 청소에'@ DirtiesContext'를 사용했지만 테스트 실행에 소요 된 시간이 2-3 배 증가합니다. –