0

스프링 데이터 JPA 및 Spring-Data-Mongo 리포지토리 (각 클래스에는 하나의 리포지토리에 대한 테스트 만 포함)에 대한 JUnit 테스트를 만들고 있습니다. 각 테스트를 위해 내가 깨끗한 데이터베이스를 얻을 수 있도록 잘 작동 JPA (포스트 그레스 또는 H2 DB)에 대한MongoDB 용 스프링 DirtiesContext

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) 

: 각 테스트는 내가 DirtiesContext을 사용하고 실행하기 전에 데이터베이스를 정리합니다. 그러나 MongoDB에서는 제대로 작동하지 않습니다. 데이터베이스는 각 테스트 전에 다시 생성되지 않습니다. 내가 사용할 수 있습니다 알고

@Autowired 
    private MongoTemplate mongoTemplate; 

    @After 
    public void clearCollection() { 
     mongoTemplate.dropCollection(DocHeader.class); 
    } 

그러나 나는 그것이 몽고에 대한 포스트 그레스 또는 H2 작동하지만 이유를 이해하고자합니다.

답변

0

기본적으로 Spring 테스트 인프라는 동일한 구성을 사용할 때 테스트 용으로 만든 응용 프로그램 컨텍스트를 다시 사용합니다.

@DirtiesContext은 응용 프로그램 컨텍스트를 더티 (dirty)로 표시합니다. 즉, 어떤 방식 으로든 테스트 (또는 이전 테스트 일 수 있음)로 변경되어 새로운 응용 프로그램 컨텍스트가 만들어집니다.

데이터베이스에 대해 새로운 DataSource을 만드는 과정이 포함됩니다.

H2 메모리 내 데이터베이스을 사용하면 새 DataSource을 생성하고 이전 버전을 삭제하면 실제로 데이터베이스가 제거되고 새 데이터베이스가 만들어집니다. 이 동작은 JDBC-URL 매개 변수를 통해 구성 할 수 있습니다. 자세한 내용은 http://www.h2database.com/html/features.html#embedded_databases을 참조하십시오.

정상 데이터베이스 낙하 및 Connection S/DataSource들 다시 데이터베이스에 아무것도하지 않고 데이터와 스키마가 변경되지 않습니다.

+0

답변 해 주셔서 감사합니다. 이제 PostgreSQL에서 왜 작동하는지에 대한 질문입니다. 컨텍스트가 dirty로 표시되면 PostgreSQL 데이터베이스 데이터가 새로 고쳐집니다. 그래서 Mongo와 똑같은 방식으로 작동합니다. 그러나 Mongo의 경우 작동하지 않습니다. 왜 그런지 알아? – Adam

+0

응용 프로그램 속성에서 spring.jpa.hibernate.ddl-auto = create-drop을 사용하고 있기 때문에 Postgres에서 작동한다고 가정합니다. 이 모드를 업데이트하도록 변경하면 DirtyiesContext가 설정되어 있어도 데이터가 제거되지 않고 스키마가 재생성되지 않습니다. 지금 나는 Mongo와 비슷한 옵션이 있다고 생각하고 있는가? – Adam

관련 문제