微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在JUnit5中测试WireMockServer?

如何解决如何在JUnit5中测试WireMockServer?

我正在尝试编写一个微型库来进行测试,以模拟常见的外部服务,例如电子邮件,SFTP,存储桶,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。

解决方法

如注释静态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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。