簡體   English   中英

Java集成測試中的java.net.SocketTimeoutException,同時使用帶有Spring Boot和Junit的Wiremock

[英]java.net.SocketTimeoutException in integration test in Java while using Wiremock using Spring Boot with Junit

我正在使用Wiremock來模擬集成測試中的外部操作員響應:

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

並得到這個例外

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

這是我的wiremock

 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));

    }

問題是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表現出相似的行為,因此您的應用將對生產系統中的故障轉移更具彈性。

嗨,我遇到了同樣的問題,我在github上遵循了bernyfox的建議並解決了這個問題。

我的問題是http客戶端報告了SocketTimeout。 建議的解決方案是告訴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()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM