是否可以在 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 服务

是否可以从 Maven 多模块项目的父模块中的配置文件夹加载 Spring-Boot 属性?

是否可以在不使用 Spring Boot JPA 的情况下测试基于 java 的 CRUD?