我有一个spring + hibernate应用程序,它使用postgres数据库。我需要为控制器编写单元测试。对于测试,我想使用h2数据库,但不幸的是,在创建-删除过程中测试崩溃,给我留下了bpchar数据类型无效的信息。我想知道如何解决这个问题,以便我可以运行测试。
我不能使用bpchar将我的列更改为varchar,它需要保持原样。我也尝试设置postgresql模式,但没有帮助。我唯一的解决方案是使用嵌入式postgres数据库来执行测试,这是对的吗?还是有其他我可以使用的方法?
发布于 2019-06-04 05:30:57
解决这个问题的一种有趣的方法是Test Containers
由于Postgres没有嵌入式模式,但您可以在测试前使用上述框架启动docker容器,如果您使用的是Flyway或Liquibase或集成您的自定义解决方案,请创建一个模式并应用迁移。
其想法是,容器将在运行时准备好并可供测试使用。测试通过后(无论实际结果、成功还是失败),您都可以停止容器。
启动容器可能非常昂贵(大约几秒钟),但是您可以在测试期间利用spring缓存配置,因此当模块中的第一个测试启动时,容器实际上是启动的,但是,它在测试和测试用例之间得到重用,因为应用程序上下文不会重新启动。
由于您将spring的@Transactional
注释放在测试用例上,因此在测试之间保持数据库的整洁也成为一项微不足道的任务,因此spring会在每次测试后人为地回滚事务。因为在Postgres中,即使是DDL命令也可以是事务性的,这应该足够好了。
这种方法的唯一限制是,如果你计划在本地运行这些测试,你应该在构建机器或本地开发机器上有一个可用的docker (在Linux和Mac OS上无论如何这都不是问题,但在Windows上,你至少需要有Windows 10专业版才能安装docker环境)。
我在实际项目中使用了这种方法,并发现它对集成测试非常有效。
https://stackoverflow.com/questions/56434081
复制相似问题