【发布时间】:2018-05-22 00:00:24
【问题描述】:
我正在构建 Spring+Hibernate Java 应用程序。我想添加一些集成测试,在 in-memory 数据库中完成。
所以,我的普通数据库是 Postgresql,我使用使用 flyway 插件运行的 .sql 脚本来填充它。 ID 字段设置为 BIGSERIAL。我想使用 in-memory 数据库来模仿我原来的数据库,然后尝试用它测试一些类。我设法配置了几乎所有东西(我希望如此),但是当我运行测试类本身时,CREATE TABLE 脚本出现错误:
原因:org.hsqldb.HsqlException:找不到类型或用户缺少权限:BIGSERIAL
我发现我应该配置 HSQLDB,以启用 Postgresql 兼容性。 使用 SET DATABASE SQL SYNTAX PGS TRUE 或等效的 URL 属性 sql.syntax_pgs=true 来启用 PostgreSQL 的非标准功能。
我使用 persistence.xml 来定义正常和测试持久性单元。这是负责定义测试持久性单元的片段:
<persistence-unit name="testJPA">
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.connection.username" value="sa"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.connection.url" value="jdbc:hsqldb:mem:butterfly;sql.syntax_pgs=true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
然后我使用配置类进行测试:
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"core.utilities"} )
@EnableTransactionManagement
public class TestsInitializer {
@Bean
public LocalEntityManagerFactoryBean entityManagerFactory() {
LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
factoryBean.setPersistenceUnitName("testJPA");
return factoryBean;
}
}
在测试类本身:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestsInitializer.class }/*, loader = AnnotationConfigContextLoader.class*/)
@Transactional
public class GenreBATest {
@Autowired
private GenreBA genreBA;
@Test
public void testFindAllAccounts() {
//whatever
}
}
我在 URL 的末尾添加了所需的属性,在互联网上找到了这个确切属性的示例,但它并没有解决我的问题。
我仍然收到:消息:找不到类型或用户缺少权限:BIGSERIAL
我做错了什么?
【问题讨论】:
标签: java unit-testing hsqldb