是否可以在 Spring(非 Boot)上使用 Testcontainers?
Posted
技术标签:
【中文标题】是否可以在 Spring(非 Boot)上使用 Testcontainers?【英文标题】:Is it possible to use Testcontainers on Spring (non Boot)? 【发布时间】:2021-03-03 01:43:49 【问题描述】:我正在为有点旧的应用程序设计集成测试,但我面临的问题是我有一个服务我只想用于一次集成测试。
该应用程序包含多个模块、4 个弹簧(非启动)应用程序,这些应用程序正在使用这些服务:
PostgreSQL 数据库 RabiitMQ 实例 ElasticSearch 实例整个堆栈目前通过 docker-compose 进行 docker 化(因此使用 docker-compose up 整个应用程序启动,创建数据库架构等)。
我想通过测试容器来实现这一点。所以启动 PostgreSQL 容器,我在其中运行 flyway 脚本来创建模式和完整的数据库,其中包含运行所需的数据(其他数据将在单独的测试中添加),然后启动 RabbitMQ,然后启动 ElasticSearch 实例。
每次集成测试运行时,所有这些都会自动运行。
这甚至可以使用“旧版”Spring(非 Boot)吗? 这是否可以自动化它可以在一台服务器上运行多次的过程(因此不会有任何端口冲突)。目标是在提交合并请求后在 sobe Git 存储库上运行它,以检查所有集成测试是否通过。
感谢您的建议。
【问题讨论】:
【参考方案1】:Testcontainers 从一开始就完全独立于 Spring,实际上据我所知,最近才添加了一些与 Spring Boot 集成的王者。
有几种方法可以实现这一点,最简单的方法是创建一些容器作为测试类字段,如here [1] 所述
是的,可以在没有冲突的情况下实现这一点,请阅读here。简而言之 - Testcontainers 在随机主机端口上公开容器的端口(对于 Postgres 的 ex 5432)以避免冲突,您可以获得文章中描述的实际端口。对于 JDBC 容器,它甚至可以是 easier。
我没有亲自使用过 RabbitMQ 和 ElasticSearch,但是有一些模块,你可以在文档中阅读。
附:也可以为此使用 Docker Compose 支持,但我找不到任何理由,仅供参考,上面的方法更简单。
[1] @Testcontainers
注释将为您启动它们,但您也可以manually 管理容器生命周期。
【讨论】:
以上是关于是否可以在 Spring(非 Boot)上使用 Testcontainers?的主要内容,如果未能解决你的问题,请参考以下文章
如何为非Spring Boot的Java应用程序指定外部配置文件
如何在与MongoDB集成的Spring boot Elastic Search中实现对非结构化数据的搜索
传统Java Web(非Spring Boot)非Java语言项目接入Spring Cloud方案
如何使用 Spring Boot 构建非阻塞异步 Web 服务