我有一个使用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不允许相对路径,以便我可以将数据库文件放在资源文件夹中。
有没有人有一个想法如何解决这个问题?
谢谢。
您是否使用相同的连接来创建模式并运行测试? –
是的,在工作(使用文件配置)和不工作(使用mem配置)的测试之间,唯一改变的是DATABASE_URL属性 – eXtreme
如何/在哪里设置属性?也许有关如何设置属性和测试配置有问题。 – msparer