在使用 Springboot 运行集成测试时启动嵌入式 gRPC 服务器

Posted

技术标签:

【中文标题】在使用 Springboot 运行集成测试时启动嵌入式 gRPC 服务器【英文标题】:Start an embedded gRPC server while running integration tests with Springboot 【发布时间】:2020-06-09 21:15:54 【问题描述】:

我已经构建了一个 Springboot 应用程序,它有一个 gRPC 服务器作为其依赖项之一。在运行集成测试时,我可以通过 TestContainers 使用嵌入式 Kafka、嵌入式 mysql 等,但是如何在运行集成测试套件时创建嵌入式 gRPC 服务器?

我有 .proto 合同定义文件。我会使用 Wiremock 模拟对 gRPC 服务器的请求和响应,但我还无法启动嵌入式 gRPC 服务器。

如果我能在这里找到一些帮助,那就太好了。

想一想,我的问题可以概括为在 Springboot 集成测试中使用 TestContainers 或其他方式启动通用嵌入式 HTTP 服务器。

【问题讨论】:

这对***.com/questions/31938242/… 有用吗? 那里共享的两个 repos 值得研究。但是,在我看来,他们并不是在谈论在集成测试环境中使用 gRPC 服务器。我自己想出了如何设置一个模拟 gRPC 服务器来进行集成测试,我将提供它作为这个问题的答案。 【参考方案1】:

我在 IT 测试 Java gRPC 服务集成时遇到了类似的问题,因为当您需要为不同的测试返回不同的响应时,使用 InProcessServer 非常麻烦且很难使用。此外,在使用它时,您无法真正测试您的 Stub bean 及其配置,因为您无法将 InProcessServer 主机作为变量传递。

为此,我创建了一个 gRPC Java 模拟工具 gRPC Mock。它有两个集成模块——一个用于 spring-boot,一个用于 JUnit5。它遵循与 HTTP 模拟服务 WireMock 类似的 DSL 类型的结构来创建存根。您可以访问 GitHub 页面获取一些示例。

【讨论】:

以上是关于在使用 Springboot 运行集成测试时启动嵌入式 gRPC 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA 元模型不能为空!尝试运行 JUnit / 集成测试时

如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?

需要设置一个配置文件,让 Flyway 在重新启动时清理数据库

启动时如何配置 Spring Boot 应用程序以在特定数据库上运行

如何使用带有 gradle 的多个嵌入式服务器运行 spring-boot 集成测试

仅在设置了特定的弹簧配置文件时才运行集成测试