2016-04-10 54 views
4

我運行一個JUnit集成測試與配置,像這樣的內存數據庫H2:JUnit的多線程測試與Spring的事務中

@Bean 
public DataSource dataSource() { 

    try { 
     SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource(); 
     simpleDriverDataSource.setDriverClass((Class<? extends Driver>) ClassUtils.forName("org.h2.Driver", this.getClass().getClassLoader())); 
     simpleDriverDataSource.setUrl("jdbc:h2:file:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;MVCC=true;FILE_LOCK=NO;mv_store=false"); 
     simpleDriverDataSource.setUsername("sa"); 
     simpleDriverDataSource.setPassword(""); 

     return simpleDriverDataSource; 
    } catch(ClassNotFoundException e) { 
     throw new IllegalStateException(e.getMessage()); 
    } 

} 

試驗使得對服務方法的調用。此服務方法使用執行程序服務來分解處理。在調用服務類之前,測試方法會將一些數據插入到數據庫中,並且可以使用服務(通過JPA存儲庫調用)讀取此數據,直到將任務提交給執行程序服務。但是,運行任務時,無法讀取之前保存的數據。

如何讓分叉的線程看到持久數據?

注意:這只是單元測試失敗,它在運行時工作正常。

回答

2

假設您的測試是@Transactional,您所看到的是預期行爲,因爲您(通常)不希望測試所做的更改對系統的其他部分可見,並且可能會在測試結束。

一個簡單的方法來解決這個問題是註釋@Test方法這樣

我已經能夠重現旅遊行爲不propagation = Propagation.NEVER並看到它與它解決。

請注意,您必須將數據庫還原到一個乾淨的狀態運行測試後,手動,或通過該測試所做的更改,將可見於其他測試