2017-09-26 79 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

相关问题