【问题标题】:How to test WireMockServer in JUnit5?如何在 JUnit5 中测试 WireMockServer?
【发布时间】:2020-09-17 14:45:11
【问题描述】:

我正在尝试编写一个用于测试的小型库,以模拟常见的外部服务,例如电子邮件、SFTP、Bucket、HTTP API。

目前,我被困在WireMockServer 上。在WireMock docs 中声明我可以创建服务器和客户端来验证 API 调用。

我写了这门课:

public class WireMockTestServer {

    private final WireMockServer server;

    public WireMockTestServer(String address, MappingBuilder mappingBuilder) {
        server = new WireMockServer(wireMockConfig().dynamicPort().dynamicHttpsPort());
    }

    public WireMockTestServer(int httpPort, int httpsPort, String address, MappingBuilder mappingBuilder) {
        server = setup(
                new WireMockServer(wireMockConfig().port(httpPort).httpsPort(httpsPort).bindAddress(address)),
                mappingBuilder
        );
    }

    private WireMockServer setup(WireMockServer server, MappingBuilder mappingBuilder) {
        server.stubFor(mappingBuilder);
        return server;
    }

    public void start() {
        server.start();
    }

    public void stop() {
        server.stop();
    }
}

我可以路径端点声明并将我的服务重定向到它。

当我尝试测试它时:

public class WireMockTestServerTest {

    @Test
    public void testSetup() throws Exception {
        MappingBuilder mappingBuilder = get(urlEqualTo("/health"))
                .willReturn(aResponse().withHeader("Content-Type", "application/json")
                        .withStatus(200));
        WireMockTestServer server = new WireMockTestServer(8888, 9988, "127.0.0.1", mappingBuilder);
        server.start();


        // This line should fail
        verify(getRequestedFor(urlEqualTo("/health")).withHeader("Content-Type", equalTo("text/xml")));
        server.stop();
    }

}

测试失败。问题是,它失败不是因为断言,而是因为它从错误的端口 8080 开始,该端口被其他进程占用。

如何在另一个端口上启动 WireMockServer 并使用 JUnit 5 对其进行测试?

我正在使用 Java 8、Maven、Spring Boot。

【问题讨论】:

  • 您正在尝试针对默认实例进行验证,但您正在配置一个独立实例。您应该针对您所在领域的私有实例进行验证。

标签: java spring-boot testing junit5 wiremock


【解决方案1】:

正如评论中提到的,静态verify 方法尝试根据默认的wiremock 实例进行验证。由于您在测试中创建了一个独立实例,因此您应该对其进行验证。在您的 WireMockTestServer 中创建一个 verify 方法:

public void verify(final RequestPatternBuilder requestPatternBuilder) {
    server.verify(requestPatternBuilder);
}

然后您可以对其进行验证:

@Test
public void testSetup() throws Exception {
    MappingBuilder mappingBuilder = get(urlEqualTo("/health"))
            .willReturn(aResponse().withHeader("Content-Type", "application/json")
                    .withStatus(200));
    WireMockTestServer server = new WireMockTestServer(8888, 9988, "127.0.0.1", mappingBuilder);
    server.start();

    // This line should fail
    server.verify(getRequestedFor(urlEqualTo("/health")).withHeader("Content-Type", equalTo("text/xml")));
    server.stop();
}

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2017-08-24
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多