Vic*_*tor 7 spring integration-testing wiremock
在使用 Spring 和 Wiremock 进行集成测试时,我遇到了一种非常奇怪的情况:突然,一个特定的测试开始间歇性失败。下面是错误的片段:
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:10314/my/endpoint": Software caused connection abort: recv failed; nested exception is java.net.SocketException: Software caused connection abort: recv failed
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:468) ~[spring-web-5.3.7.jar:5.3.7]
... more logs here ...
Run Code Online (Sandbox Code Playgroud)
上下文如下:我添加了一个使用wiremock 来存根响应的新测试:
wireMockServer.stubFor(WireMock.post("/my/endpoint")
.withRequestBody(containing(aJsonRequestBodyHere))
.willReturn(aResponse()
.withBody(aJsonResponseHere)
.withStatus(HttpStatus.OK.value())
.withHeader(HttpHeader.CONTENT_TYPE.toString(), CONTENT_TYPE_APPLICATION_JSON)));
Run Code Online (Sandbox Code Playgroud)
对此存根端点的调用如下:
given()
.when()
.get("my/endpoint")
.then()
.body(containsString(theExpectedJsonResponse)))
.statusCode(200);
Run Code Online (Sandbox Code Playgroud)
奇怪的部分:
经过一番深入研究后,我发现这篇文章和这篇文章几乎 100% 描述了我的情况。
根本原因似乎是测试执行得太快——也许那些没有做太多事情——而 Wiremock 没有时间为下一个测试正确设置。Thread.sleep(2000)我通过在测试开始时添加 a 来测试这个假设,然后多次运行所有测试 - 所有测试都顺利通过。
第一篇文章中介绍了解决方案:注册一个Transformer类,该类将拦截所有响应并向Connection=close其添加标头。
更详细地说:我添加了一个Transformer类,该类扩展ResponseDefinitionTransformer并在每个响应上添加Connection标头。然后我创建了@Configuration带注释的类并注册了它Transformer
Transformer 类(摘自第一篇文章):
public class NoKeepAliveTransformer extends ResponseDefinitionTransformer {
@Override
public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files, Parameters parameters) {
return ResponseDefinitionBuilder.like(responseDefinition)
.withHeader(HttpHeaders.CONNECTION, "close")
.build();
}
@Override
public String getName() {
return "keep-alive-disabler";
}
}
Run Code Online (Sandbox Code Playgroud)
配置类:
@Configuration
public class WiremockConfiguration {
@Bean
WireMockConfigurationCustomizer optionsCustomizer() {
return options -> options.extensions(NoKeepAliveTransformer.class);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |