如何在JUnit5中测试WireMockServer?

Dmytro Chasovskyi:

我正在尝试编写一个微型库来进行测试,以模拟常见的外部服务,例如电子邮件,SFTP,存储桶,HTTP API。

此刻,我陷入困境WireMockServerWireMock文档中,它声明我可以同时创建服务器和客户端来验证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。

michalk:

如注释中所述,静态verify方法尝试针对默认的Wiremock实例进行验证。由于您要在测试中创建独立实例,因此您应该对其进行验证。verify在您方法中创建一个方法WireMockTestServer

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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章