如何在使用bpchar的h2数据库中执行单元测试?

时间:2019-06-03 20:23:21

标签: java spring postgresql testing h2

我有一个使用postgres数据库的spring + hibernate应用程序。我需要为控制器编写单元测试。对于测试,我想使用h2数据库,但不幸的是,在create-drop期间测试崩溃,使我无法得知bpchar数据类型无效的信息。我想知道如何解决此问题,以便我可以运行测试。

我无法将bpchar的列更改为varchar,它需要保持原样。我也尝试设置postgresql模式,但没有帮助。 我唯一的解决方案是使用嵌入式postgres数据库执行测试,还是我可以使用其他方法吗?

3 个答案:

答案 0 :(得分:0)

  

我是对的,我唯一的解决方案是使用嵌入式postgres数据库来执行测试,或者还有其他方法可以使用吗?

您尝试将特定于Postgres的数据类型与h2一起使用(没有)。当然,这是行不通的。

如果您不能更改此字段的类型,请在测试中使用嵌入式postgres。

答案 1 :(得分:0)

解决此问题的一种有趣方法是Test Containers

由于Postgres没有嵌入式模式,但是如果您使用的是Flyway或Liquibase之类的东西,或者您集成了自定义解决方案,则可以使用上述框架在测试之前启动docker容器,创建模式并应用迁移。

这个想法是容器将准备好并且在运行时可供测试使用。 测试通过后(无论实际结果是成功还是失败),您都可以停止容器。

填充容器可能非常昂贵(大约几秒钟),但是您可以在测试期间利用弹簧缓存配置,因此,当模块中的第一个测试开始时,容器实际上已启动,但是,由于不会重新启动应用程序上下文,因此可以在测试和测试用例之间重用。

由于在测试案例上放置了Spring的@Transactional批注,因此在测试之间保持数据库的清洁也变得很简单,因此Spring在每次测试后都会人为地回滚事务。由于在Postgres中,即使DDL命令也可以是事务性的,所以它应该足够好。

此方法的唯一局限性是,如果您打算在本地运行这些测试(在Linux和Mac OS上这不是问题,但在Windows上,则应该在构建计算机或本地开发计算机上有一个docker可用)至少需要Windows 10专业版才能安装docker环境。

我已经在实际项目中使用了这种方法,发现它对于集成测试非常有效。

答案 2 :(得分:0)

实际上,您可以在 application.properties 中执行此操作,以让H2知道:

spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE TYPE BPCHAR AS CHARACTER NOT NULL

还要确保在测试时已关闭数据库的自动配置。您可以通过添加以下内容来实现:

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MyTestForTableWithBpcharColumn {