问题描述
我正在尝试编写一个微型库来进行测试,以模拟常见的外部服务,例如电子邮件,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();
}