如何在 spring 启动应用程序状态启动之前获取 wiremock 运行?

How to get wiremock running before the spring boot application status up?

我有一个 spring 启动微服务的集成测试。问题是该服务在启动时调用外部服务(通过 REST)。我正在使用 WireMock 来模拟调用。 Spring 使应用程序在 WireMock 启动之前启动。因此,rest 调用失败,服务也失败。

调用的是一个库,也是我们公司做的,所以我不能在那里改变任何东西。

你对我有什么建议吗?

您可以在测试中创建 WireMockServer 的静态实例。这是一个代码示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTests {
    static WireMockServer mockHttpServer = new WireMockServer(10000); // endpoint port here

    @BeforeClass
    public static void setup() throws Exception {
        mockHttpServer.stubFor(get(urlPathMatching("/")).willReturn(aResponse().withBody("test").withStatus(200)));
        mockHttpServer.start();
    }

    @AfterClass
    public static void teardown() throws Exception {
        mockHttpServer.stop();
    }

    @Test
    public void someTest() throws Exception {
        // your test code here
    }
}

Spring 引导团队构建了 WireMock 集成。可能值得检查一下而不是自己滚动:http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.2.RELEASE/#_spring_cloud_contract_wiremock

我来晚了,但我一直在为同样的事情苦苦挣扎好几次,虽然接受的答案在很多情况下都有效,但这是我想出的解决方案:

https://github.com/ThomasKasene/wiremock-junit-extension

这是您在测试中放置的自定义 JUnit Jupiter 扩展 class,它会为您启动服务器,很像 Spring Cloud Contract 的版本。不同之处在于它与 Spring 上下文分离,因此它可以在 Spring 启动其上下文之前启动。

如果您在 JUnit 测试中以编程方式 运行ning Wiremock,您可能 运行 进入竞争状态,因为 start() 是非阻塞的。查看官方文档 here 它指出在 JUnit 测试的上下文中:

  • 对于 JUnit 4.x 和 JUnit 5 Vintage 你应该使用包含的 JUnit 规则 在 WireMock
  • 对于 JUnit 5+ Jupiter,使用 JUnit Jupiter 扩展