【问题标题】:java.net.SocketTimeoutException in integration test in Java while using Wiremock using Spring Boot with Junitjava.net.SocketTimeoutException 在 Java 中的集成测试中,同时使用带有 Junit 的 Spring Boot 使用 Wiremock
【发布时间】:2019-02-27 06:10:19
【问题描述】:

我正在使用wiremock in 在集成测试中模拟外部操作员响应:

@ClassRule
public static WireMockClassRule zainWireMockStatic = new WireMockClassRule(9900);

并得到这个异常

requesting to java.net.SocketTimeoutException: connect timed out timed out

这是我的线模

 private static void wireMockZainUnSubscriptionRequest() {
        zainWireMockStatic.stubFor(get(urlPathMatching("/api/unsubscribe")).willReturn(
                aResponse().withStatus(200).withHeader("Content-Type", "application/json")
                        .withBody(FileUtils.readFileFromClasspath(
                                "data/mocks/zain_unsubscribe_success_response.json"))));

    }

这是我的测试

    @Test
    public void unsubscribeUserWithSuccessResponse() {
        wireMockZainUnSubscriptionRequest();
        given().body(FileUtils.readFileFromClasspath("data/message/unsubscribe_request.json"))
                .contentType(ContentType.JSON).post(UNSUBSCRIBE_API).then().statusCode(200)
                .body("user_id", equalTo(USER_ID));

    }

【问题讨论】:

    标签: java spring-boot wiremock


    【解决方案1】:

    问题在于 Spring Boot 运行器在每个 class 中启动和停止其 servlet 容器一次。如果您使用 WireMock 规则,那么它会在每个 测试方法 中启动和停止一次。这意味着 Spring 应用程序中的池连接在测试用例之间被渲染为无效。

    您可以通过三个选项来解决此问题:

    1. 切换到 Spring 团队的 WireMock 集成:http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.2.RELEASE/#_spring_cloud_contract_wiremock
    2. 切换到使用 @ClassRule 以便 WireMock 启动和停止每个测试类。
    3. 配置您的 Spring HTTP 客户端以检测并丢弃死池连接。此选项的一个优点是您的应用对生产系统中的故障转移更具弹性,因为许多负载均衡器/反向代理/浮动 IP 会表现出类似的行为。

    【讨论】:

      【解决方案2】:

      您好,我也遇到了同样的问题,我按照bernyfox on the github的建议解决了这个问题。

      我的问题在于它报告 SocketTimeout 的 http 客户端。建议的解决方案是告诉 httpclient 连接将通过扩展关闭。

      我做了这个:

      public class ConnectionCloseExtension extends ResponseTransformer {
      
          @Override
          public ResponseDefinition transform(Request request, ResponseDefinition response, FileSource files) {
              HttpHeaders headersWithClose;
              HttpHeader closeHeader = new HttpHeader("Connection", "Close");
              if(response.getHeaders()!=null){
                  headersWithClose = HttpHeaders.copyOf(response.getHeaders())
                          .plus(closeHeader);
              }else{
                  headersWithClose = new HttpHeaders(closeHeader);
              }
              response.setHeaders(headersWithClose);
              return response;
          }
      
          @Override
          public String name() {
              return "ConnectionCloseExtension";
          } }
      

      并应用它:

      @Rule
      public WireMockRule wireMockServer = new WireMockRule(wireMockConfig()
              .extensions(new ConnectionCloseExtension()));
      

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 2020-11-19
        • 2022-11-18
        • 2019-03-07
        • 2015-01-01
        • 1970-01-01
        • 2014-08-12
        • 2022-06-23
        • 1970-01-01
        相关资源
        最近更新 更多