我的服務器通過 WebClient 發送請求,代碼如下:
public String getResponse(String requestBody){
...
WebClient.RequestHeadersSpec<?> request =
client.post().body(BodyInserters.fromValue(requestBody));
String resp =
request.retrieve().bodyToMono(String.class)
.doOnError(
WebClientResponseException.class,
err -> {
// do something
})
.block();
return resp;
}
我為它撰寫了一個單元測驗并想模擬 WebClient 以便我可以收到預期的回應:
when(webClientMock.post()).thenReturn(requestBodyUriMock);
when(requestBodyUriMock.body(BodyInserters.fromValue(requestBody))).thenReturn(requestHeadersMock);
when(requestHeadersMock.retrieve()).thenReturn(responseMock);
when(responseMock.bodyToMono(String.class)).thenReturn(Mono.just("response"));
String response = someServiceSpy.getResponse(requestBody);
assertEquals(Mono.just("response"), response);
但是,結果不是,"response"而是一個 html 檔案。我想我在某個地方犯了一個錯誤,但我不知道如何解決它。
uj5u.com熱心網友回復:
client您的方法中參考的似乎getResponse未設定為您在測驗中創建的模擬(webClientMock)。
如果您client在方法中創建此物件getResponse,我建議您使用可以模擬的方法創建它。就像是
WebClient buildWebClient() {
// build your webclient using the WebClientBuilder
}
您可能想在此處添加注釋和/或@VisibleForTesting注釋,因此很明顯存在此方法是為了使測驗更容易。
然后你可以在你的存根這個方法someServiceSpy:
Mockito.doReturn(mockWebClient).when(someServiceSpy).buildWebClient();
這將確保您在測驗中的方法中mockWebClient使用您的getResponse方法。
此外,您現有的代碼似乎需要稍作修改。
when(requestBodyUriMock.body(BodyInserters.fromValue(requestBody))).thenReturn(requestHeadersMock);
應該
when(requestBodyUriMock.body(eq(BodyInserters.fromValue(requestBody)))).thenReturn(requestHeadersMock);
uj5u.com熱心網友回復:
我已經找到了WebClient直接模擬而不是將構建邏輯放入新方法來模擬它的解決方案。我在這里寫了我的解決方案,以防其他人將來需要它:
讓我把代碼示例放在這里:
final WebClient client =
WebClient.builder()
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(someValue))
.clientConnector(new ReactorClientHttpConnector(HttpClient.create(someProvider)))
.baseUrl(someUrl)
.defaultHeader(contentType, TEXT_XML_VALUE)
.build();
final WebClient.RequestHeadersSpec<?> request =
client.post().body(BodyInserters.fromValue(reqBody));
首先,我們必須mock 的靜態方法builder()。WebClient如果這個方法沒有被mock,mockito就不能編輯這個方法的行為,被mock的WebClient就不會被使用。我從這個 StackOverflow 問題的答案中找到了這一點;您可以閱讀它以獲取更多詳細資訊。:如何模擬 Spring WebClient 和構建器
builder()使用上面的 anwser 提供的方法模擬后,你會得到一個 mocked ,WebClient它是這樣的:
when(webClientBuilder.build()).thenReturn(webClientMock);
然后你就可以開始完成剩下的作業了。在我的示例代碼中,client將呼叫post()and body(),因此撰寫以下內容:
when(requestBodyUriMock.body(any())).thenReturn(requestHeadersMock);
when(requestHeadersMock.retrieve()).thenReturn(responseMock);
when(responseMock.bodyToMono(String.class)).thenReturn(Mono.just(expectedResponse));
我的單元測驗一開始就回傳了 NPE,因為我使用了
when(requestBodyUriMock.body(BodyInserters.fromValue(requestBody))).thenReturn(requestHeadersMock);
代替
when(requestBodyUriMock.body(any())).thenReturn(requestHeadersMock);
我認為這是因為代碼沒有“認為”requestBodyUriMock正在使用BodyInserters.fromValue(requestBody我還不知道的某些原因。在我將其更改為 之后any(),它起作用了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/528962.html
