2017-09-26 30 views
1

我有一個使用Hibernate設置的Spring MVC項目,並且想爲某些服務創建一些測試。 主要的應用程序使用PostgreSQL數據庫和測試,我想使用H2內存數據庫H2數據庫在內存中不起作用只有文件

我創建單獨的配置文件的測試(包括Spring和Hibernate) 一切工作順利,直到我試着打了內存數據庫

Hibernate配置:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories("<repository>") 
public class DataSourceTestConfig { 

private static final Logger LOG = LogManager.getLogger(DataSourceTestConfig.class); 

private static final String DATABASE_DRIVER = "org.h2.Driver"; 
//private static final String DATABASE_URL = "jdbc:h2:file:d:/test"; 
private static final String DATABASE_URL = "jdbc:h2:mem:test"; 
private static final String DATABASE_USERNAME = "sa"; 
private static final String DATABASE_PASSWORD = ""; 

private static final String HIBERNATE_DIALECT = "org.hibernate.dialect.H2Dialect"; 
private static final String HIBERNATE_SHOW_SQL = "true"; 
private static final String ENTITYMANAGER_PACKAGES_TO_SCAN = "<packages>"; 
private static final String HIBERNATE_HBM2DDL_AUTO = "create"; 
... 

這個問題似乎是與DATABASE_URL:

如果我使用:

DATABASE_URL = "jdbc:h2:file:d:/test"; 

一切按預期工作。所有的測試運行,因爲他們應該

如果我使用:

DATABASE_URL = "jdbc:h2:mem:test"; 

地獄破散,它不工作:)

在這種情況下,我得到

org.h2.jdbc.JdbcSQLException: Table "test" not found; SQL statement: ... 

翻翻在Hibernate日誌中可以清楚地看到表格實際上已經生成了:

DEBUG org.hibernate.SQL - drop table test if exists 
... 
DEBUG org.hibernate.SQL - create table test (<columns>) 
... 
DEBUG org.hibernate.SQL - alter table test add constraint FKg74a38x6t762qifuge9cux03i foreign key ... 

等等......

對我來說,它看起來像在這種情況下產生的數據庫,不知何故,我的工作還是在不同的實例或有事和表的創建和我的測試之間下降。

這些情景在我看來不太可能,因爲沒有Hibernate的日誌,以表明這一點(沒有下降查詢)的測試日誌創建日誌

我在這裏發現了這個類似的問題後,立即啓動:H2 in-mem-DB with hibernate set to create giving me table not found errors

但解決方案就是使用文件。

這不是我的解決方案,因爲這些測試必須在運行不同操作系統的很多機器上執行,因此硬編碼路徑文件不是一個選項。此外,JDBC不允許相對路徑,以便我可以將數據庫文件放在資源文件夾中。

有沒有人有一個想法如何解決這個問題?

謝謝。

+0

您是否使用相同的連接來創建模式並運行測試? –

+0

是的,在工作(使用文件配置)和不工作(使用mem配置)的測試之間,唯一改變的是DATABASE_URL屬性 – eXtreme

+0

如何/在哪裏設置屬性?也許有關如何設置屬性和測試配置有問題。 – msparer

回答

0

作爲結論,這個我最終沒有內存數據庫使用,而是一個文件一個。

如上所述here可以添加一個顯式的相對文件路徑到數據庫url。

我最終什麼事做的是設置DATABASE_URL到:

DATABASE_URL = "jdbc:h2:file:./src/test/resources/test"; 

這會在資源文件夾,這是完全可以接受的數據庫文件。

0

你能顯示與測試有關的所有配置文件嗎?你有一個名爲「測試」表,因爲在網址「..test」指的是數據源

you can find some tips here

+0

嗨,如果我發佈所有與測試有關的類,帖子會變得相當長。 「測試」表和數據庫名稱只是爲了便於閱讀。實際的表和數據庫名稱是不同的,並且它們之間沒有混淆。此外,問題是,當我更改數據庫網址以使用h2:mem事件發生故障時。如果我將配置保留爲h2:文件一切正常(超過50次使用數據庫的測試按預期工作) – eXtreme

相關問題