如何在单个 JUnit 测试中运行两个 Spring Boot 微服务?

Posted

技术标签:

【中文标题】如何在单个 JUnit 测试中运行两个 Spring Boot 微服务?【英文标题】:How to run two Spring Boot microservices in a single JUnit test? 【发布时间】:2018-06-01 01:32:29 【问题描述】:

我有两个 Spring Boot REST 微服务,我们称它们为 A 和 B。我们还假设 A 对 B 进行 REST 调用。

我想在单个 JUnit 测试中在 A 和 B 之间使用 test the integration。也就是说,我想编写一个测试,以确保从 A 到 B 的通信和配置是有序的。

我知道我可以在我的测试中使用 @SpringBootTest 注释在 Spring 的“内置”测试 Web 服务器中运行单个微服务。

是否可以在一个测试中以类似的方式同时运行 A 和 B?

【问题讨论】:

在我看来,JUnit 的重点是单元测试而不是集成测试。 谢谢@snap。我同意 JUnit 专注于单元测试,但这并不妨碍它成为各种其他测试的有用驱动程序,例如:使用 Selenium 进行端到端测试。我的问题的重点是如何在一个测试中运行 2 个 Spring 的测试 Web 服务器实例。 【参考方案1】:

我想我已经设法通过从我的 JUnit 测试中删除 @SpringBootTest 并使用 SpringApplicationBuilder 分别实例化两个微服务来实现。

A 是 Demo1Application,B 是 Demo2Application

@Test
public void test1() 
    HashMap<String, Object> props1 = new HashMap<>();
    props1.put("server.port", 8092);

    SpringApplicationBuilder builder1 = new SpringApplicationBuilder(Demo1Application.class);
    builder1
        .properties(props1)
        .run(new String[]"");

    HashMap<String, Object> props2 = new HashMap<>();
    props2.put("server.port", 8093);

    SpringApplicationBuilder builder2 = new SpringApplicationBuilder(Demo2Application.class);
    builder2
    .properties(props2)
        .run(new String[]"");

【讨论】:

以上是关于如何在单个 JUnit 测试中运行两个 Spring Boot 微服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何将循环运行的测试用例添加到通过 SOAPUI 生成的 Junit 报告中

Maven 和 JUnit 5:在一个类中运行单个测试

使用命令行从 JUnit 类运行单个测试

如何在 Xcode 中运行单个测试用例?

Spring Boot / JUnit,为多个配置文件运行所有单元测试

如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试