12.3.2 测试 POST 请求

WebTestClient 可以做的不仅仅是针对 Controller 的 GET 请求进行测试。它还可以用于测试任何类型的 HTTP 方法,包括 GET、POST、PUT、PATCH、DELETE 和 HEAD 请求。表 12.1 将 HTTP 方法映射到 WebTestClient 方法。

表 12.1 WebTestClient 针对 Spring WebFlux 控制器测试任何类型的请求。

HTTP 方法 WebTestClient 方法
GET .get()
POST .post()
PUT .put()
PATCH .patch()
DELETE .delete()
HEAD .head()

作为针对 Spring WebFlux Controller 中的另一个 HTTP 方法请求示例的测试,让我们看看针对 DesignTacoController 的另一个测试。这次,将通过向 /api/tacos 提交 POST 请求来编写针对创建 taco 端点 API 的测试:

@SuppressWarnings("unchecked")
@Test
public void shouldSaveATaco() {
  TacoRepository tacoRepo = Mockito.mock(
                  TacoRepository.class);

  WebTestClient testClient = WebTestClient.bindToController(
        new TacoController(tacoRepo)).build();

  Mono<Taco> unsavedTacoMono = Mono.just(testTaco(1L));
  Taco savedTaco = testTaco(1L);
  Flux<Taco> savedTacoMono = Flux.just(savedTaco);

  when(tacoRepo.saveAll(any(Mono.class))).thenReturn(savedTacoMono);

  testClient.post()
    .uri("/api/tacos")
    .contentType(MediaType.APPLICATION_JSON)
    .body(unsavedTacoMono, Taco.class)
    .exchange()
    .expectStatus().isCreated()
    .expectBody(Taco.class)
    .isEqualTo(savedTaco);
}

与前面的测试方法一样,shouldSaveATaco() 首先设置一些测试数据,模拟 TacoRepository,然后构建一个 WebTestClient,并绑定到 Controller。然后,使用 WebTestClient 向 /api/tacos 提交 POST 请求,请求的 body 类型为 application/json,有效负载是未保存 Mono 中 Taco 的 json 序列化形式。在执行 exchange() 之后,测试断言响应具有 HTTP 201(CREATED) 状态,并且正文中的有效负载等于保存的 Taco 对象。

results matching ""

    No results matching ""