2015-02-24 72 views
3

如何在測試類之間從頭開始重新創建內存中測試數據庫的Spring Boot?使Spring Boot重新創建測試數據庫

我有幾個本地集成測試註釋@SpringApplicationConfiguration@WebIntegrationTest改變數據庫狀態。我已經用@DirtiesContext標出了每一個。我期待創建內存數據庫的代碼將成爲ApplicationContext生命週期的一部分,因此應該在任何後續測試中創建新代碼。

我可以在日誌中看到Flyway正在嘗試重新應用遷移,並認爲它們已經完成,因爲數據庫尚未清除。

Spring Boot是否在每個ApplicationContext之外創建內存數據庫並在它們之間共享?有沒有辦法來控制這種行爲?

編輯

從Maven的運行測試時,而不是到Eclipse我也看到奇怪的行爲。我的一個數據庫表正在改變Maven的狀態,但不是在Eclipse中。這可能是一個類加載器的問題?

+0

你希望數據庫完全重新創建或只是恢復到初始狀態測試開始的時候?如果後者,你不能使用[@Rollback](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/annotation/Rollback.html)來回滾變化。 – ikumen 2015-02-24 17:32:34

+0

感謝您的評論。我希望它們完全放棄,以便在測試之間進行最大限度的隔離。 – 2015-02-24 17:34:05

+0

對於像測試之間重新創建數據庫之類的東西,我以前使用過dbunit。還有一個[spring-dbunit集成](http://springtestdbunit.github.io/spring-test-dbunit/)。 – ikumen 2015-02-24 17:40:04

回答

1

指定自定義配置會產生預期的行爲。

@Configuration 
@EnableAutoConfiguration(exclude={ 
          SecurityAutoConfiguration.class, 
          ManagementSecurityAutoConfiguration.class, 
          DataSourceAutoConfiguration.class 
         }) 
@EnableJpaRepositories(basePackages = "com.example.repository") 
public class TestConfig {  
    @Bean 
    public String sharedSecret() { 
     return null; 
    } 

    @Bean 
    public DataSource dataSource() { 
     return new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.HSQL) 
      .build(); 
    } 
} 

如果從匹任何人讀取這個(不戴夫Syer有一個大紅色的電話嗎?),我可以敲了一個測試項目中表現出的行爲,如果你認爲這是一個錯誤。

+0

作爲_Spring TestContext Framework_的作者,如果您能創建一個演示此行爲的測試項目,我將不勝感激。如果你這樣做,請讓我知道(在GitHub和Spring的JIRA上'sbrannen'),我會看看它。 – 2015-03-04 23:30:23

2

如果不能檢查項目的配置和運行時行爲,我只能假定您遇到SPR-8849中描述的相同問題。

Spring Boot是否在每個ApplicationContext之外創建內存數據庫並在它們之間共享?

這不太可能。更有可能的情況是,只有在加載第一個ApplicationContext時才創建數據庫一次,並且在同一個JVM中執行的所有測試中使用一個單一數據庫。這可以解釋「數據庫尚未被清除」的事實,正如你所說的那樣。

有什麼辦法可以控制這種行爲嗎?

如果我上面的假設是正確的,是的:您可以通過確保您爲每個嵌入式數據庫使用唯一的數據庫名稱來控制這一點。有關詳細信息,請參閱SPR-8849中的註釋。

請讓我知道,如果這對你有用。

問候,

山姆(Spring的TestContext框架的作者)

相關問題