2016-08-23 89 views
0

我試圖通過快速啓動一個spring引導項目來生成一個將數據插入到H2數據庫並對其運行查詢的平臺來測試單獨項目實體中的jpa查詢,以及驗證這些查詢的結果。在Spring Boot中只包含單獨的實體JPA測試

因爲單獨的項目有一個大型的實體庫,我想選擇性地挑出我想要測試的實體。

我試過使用@EntityScan註解來實現這個功能,但它似乎被設計用來拉整個包,即使你只是指定了一個類。

這讓我覺得必須有解決方案,但我至今無法找到它。

+0

@ EntityScan類可能(沒檢查源代碼)被[EntityScanner]掃描(http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/自動配置/結構域/ EntityScanner.html)。也許有辦法編寫和注入自己的? – jhyot

回答

1

問題是當你設置一個帶有Spring上下文的測試類時,該上下文對於該類中的所有測試都存在,除非使用@DirtiesContext或其他一些技巧使其自身重建。

@EntityScan(basePackageClasses = MyEntity.class) 

上面的代碼並沒有告訴Spring使用MyEntity,它告訴它開始搜索在MyEntity存在於包裝實體也這樣做遞歸,所以如果你有,例如:

com.example.entities.MyEntity 
com.example.entities.subpackage.MyOtherEntity 

它會拿起兩個MyEntityMyOtherEntity。但是,如果你寫你的EntityScan這樣的:

@EntityScan(basePackageClasses = MyOtherEntity.class) 

然後MyEntity被發現。

考慮到這一點,我唯一的建議可能是將大量實體分組到多個較小的子包中,以便更容易加載,如果一次加載所有實體對您來說確實是個不錯的選擇。

0

所以,我想出了一個使用Hibernate特定代碼的解決方案。 Hibernate SessionFactoryBeans有一個addAnnotatedClass方法,所以如果你在你的配置文件中創建一個LocalSessionFactoryBean bean,你可以傳入你想要的各個類。如果你有一點創意,你可以添加你想測試的類(我也有一個DependencyGrapher,它讓我知道所有需要插入的實體類)作爲@TestPropertySource在你的測試類中,並引用這些值up代碼。

實際上,如果您使用的是Hibernate,那很遺憾,我無法做到這一點。我受限於使用EclipseLink,但似乎並沒有提供這種開箱即用的功能。儘管如此,我認爲我在Spring的PersistenceUnitPostProcessor中處於領先地位。