WebTestClient检查jsonPath是否包含子字符串

时间:2018-03-07 10:17:16

标签: java spring-test reactive

在MockMvc中,可以断言jsonPath包含substing

.andExpect(jsonPath("$.error.message")
.value(containsString("message")))

我想知道是否有一个很好的方法为WebTestClient做同样的事情,语法有点不同

webClient.post().uri("/test")
                .contentType(MediaType.APPLICATION_JSON)
                .body(Mono.just(MyRequest), MyRequest.class)
                .exchange()
                .expectStatus().isBadRequest()
                .expectBody()
                .jsonPath("$.message").isEqualTo("message")

但我发现只有与之相关的isEqualTo方法。

可以从WebTestClient.BodyContentSpec中提取getBodyAsString(),但它看起来并不好。

3 个答案:

答案 0 :(得分:1)

目前( Spring Framework 5.0.4 )不支持Hamcrest匹配器与WebTestClient一起使用。

但是,您可以使用正则表达式来测试是否存在元素包含给定子字符串的JsonPath。

例如,我刚刚在Spring自己的测试套件中验证了以下内容。请注意,/persons网址会返回人物对象列表(即new Person("Jane"), new Person("Jason"), new Person("John")),而Person类的属性为name

this.client.get().uri("/persons")
        .accept(MediaType.APPLICATION_JSON_UTF8)
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        // The following determines if at least one person is returned with a
        // name containing "oh", and "John" matches that.
        .jsonPath("$[?(@.name =~ /.*oh.*/)].name").hasJsonPath();

因此,对于您的用例,我假设以下内容可能有效:

.jsonPath("$[?(@.error.message =~ /.*substring.*/)].error.message").hasJsonPath()

另一种选择是使用consumeWith(...)代替jsonPath(...),然后直接使用Spring JsonPathExpectationsHelper(这是MockMvc内部使用的内容)。

请让我知道什么对你有用。

P.S。 SPR-16574可能会在Spring 5.x中解决这个缺点。

答案 1 :(得分:1)

请查看以下示例,以发现如何使用WebTestClient执行其余的API测试:

testClient.post().uri(URL,"value")
            .header("Authorization", "Basic " + Base64Utils
                    .encodeToString((loginInner + ":" + passwordInner).getBytes(UTF_8)))
            .exchange()
            .expectStatus()
            .isEqualTo(HttpStatus.BAD_REQUEST)
            .expectBody()
            .jsonPath("$.value_A").isEqualTo("100")
            .jsonPath("$.value_B").isEqualTo("some text")
            .jsonPath("$.value_C").isNotEmpty();

答案 2 :(得分:0)

WebTestClient WebFlux Spring Boot 2.3.4:

wtc.post()
   .uri(CREATE_ACCOUNT_URL)
   .contentType(APP_MEDIA_TYPE)
   .accept(APP_MEDIA_TYPE)
   .bodyValue(json)
   .exchange()
   .expectStatus().isBadRequest()
   .expectBody()
   .consumeWith(this::dumpToScreen)
   .jsonPath("$.timestamp").isNotEmpty()
   .jsonPath("$.path").isEqualTo(CREATE_ACCOUNT_URL)
   .jsonPath("$.status").isEqualTo(HttpStatus.BAD_REQUEST.value())
   .jsonPath("$.error").isEqualTo(HttpStatus.BAD_REQUEST.getReasonPhrase())
   .jsonPath("$.message").isEqualTo(WebExchangeBindingException.MESSAGE)
   .jsonPath("$.reason").exists()
   .jsonPath("$.reason.size()").isEqualTo(2)
   .jsonPath("$.reason.password.size()").isEqualTo(1)
   .jsonPath("$.reason.password").isEqualTo(EXC_MSG_NOT_NULL)
   .jsonPath("$.reason.email.size()").isEqualTo(1)
   .jsonPath("$.reason.email").isEqualTo(EXC_MSG_NOT_NULL);
   // When having more than 1 message
   //.jsonPath("$.reason.email").value(containsInAnyOrder(EXC_MSG_NOT_NULL, EXC_MSG_NOT_BLANK));