我遇到了同样的问题,这是我想出的解决方案。
根据文件,
WebTestClient 是围绕 WebClient 的一个瘦壳,使用它来执行请求并公开一个专用的、流畅的 API 来验证响应。
据我了解,它适用于以与断言类似的方式测试响应assertThat
。
在我的解决方案中,我改为使用WebClient
提取值。
下面的代码片段应该解释所有细节。请注意,这只是一个通用示例,您应该根据需要对其进行定制。
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import static org.springframework.http.MediaType.APPLICATION_JSON;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FooTest {
@Autowired
private WebTestClient webTestClient;
/**
* The port of the server. It starts on a RANDOM_PORT. @LocalServerPort is a way to find out what this port is.
*/
@LocalServerPort
private int port;
@Test
void someTestMethod() throws JSONException {
// Create the request body that we'll send with the POST request.
String postRequestBody = new JSONObject()
.put("JsonField_1", "value a")
.put("JsonFiled_2", "value b")
// .put("any_additional_json_fields", "with_any_values")
.toString();
// The URI where we'll send the request to.
String postRequestUri = "http://localhost:" + String.valueOf(port) + "/some_api";
// Send a POST request, and save the response.
TypeOfResponseWeExpect response = WebClient.create()
.post()
.uri(postRequestUri)
.contentType(APPLICATION_JSON)
.accept(APPLICATION_JSON)
.body(BodyInserters.fromValue(postRequestBody))
.retrieve()
.bodyToMono(TypeOfResponseWeExpect.class)
.block();
// And now we can extract any values from the response.
long extractedId = response.getId();
String token = response.getToken();
FooField fooField = response.getFoo();
BarField barField = response.getBar();
// Now we can use the extracted id field, or any field from the response.
webTestClient
.get()
.uri(uriBuilder -> uriBuilder.path("/api/messages/{id}").build(extractedId))
.headers(http -> http.setBearerAuth(token))
.exchange()
.expectStatus().isOk();
}
}
编辑:经过进一步尝试,我也找到了一种使用 WebTestClient 提取响应的方法:
TypeOfResponseWeExpect response = this.webTestClient
.post()
.uri(postRequestUri)
.contentType(APPLICATION_JSON)
.accept(APPLICATION_JSON)
.body(BodyInserters.fromValue(postRequestBody))
.exchange()
.expectBody(TypeOfResponseWeExpect.class)
.returnResult()
.getResponseBody();