使用带有Junit的Spring Boot使用Wiremock时Java中的集成测试中的java.net.SocketTimeoutException

问题描述 投票:0回答:1

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

@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个回答
1
投票

问题是Spring Boot运行器每个类启动和停止一次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将表现出类似的行为。
© www.soinside.com 2019 - 2024. All rights reserved.