带查询参数的 Spring webflux WebTestClient

在我的 webflux 应用程序中,我有这个GET端点


v3/callback?state=cGF5bWVudGlkPTRiMmZlMG

我正在尝试使用编写集成测试WebTestClient


@Test

public void happyScenario() {

    webTestClient.get().uri("/v3/callback?state=cGF5bWVudGlkPTRiMmZlMG")

            .exchange()

            .expectStatus()

            .isOk();

}

这个测试用例返回404 notFound,如果我删除了查询参数,它将被调用,但state参数将丢失


我尝试使用attribute


  webTestClient.get().uri("/v3/callback")

            .attribute("state","cGF5bWVudGlkPTRiMmZlMG")

            .exchange()

            .expectStatus()

            .isOk();

但仍然state缺少参数,使用时如何在请求中包含查询参数webTestClient?


临摹微笑
浏览 122回答 3
3回答

catspeake

您可以利用UriBuilder.webTestClient.get()            .uri(uriBuilder ->                    uriBuilder                            .path("/v3/callback")                            .queryParam("state", "cGF5bWVudGlkPTRiMmZlMG")                            .build())            .exchange()            .expectStatus()            .isOk();这应该有效。

肥皂起泡泡

如果您的查询参数值包含大括号,例如如下所示:webTestClient.get()    .uri(uriBuilder -> uriBuilder        .path("/v3/callback")        .queryParam("query", "{ some { GraphQL { query } } }")        .build())    .exchange()    .expectStatus()    .isOk();然后UriBuilder将尝试对大括号的内容进行变量替换,您可能会在调用时遇到异常build()。为了避免这种情况,请将请求参数放在单独的requestParams映射中,并通过build(requestParams)在构建时调用来使用受控变量替换URI:var requestParams = Map.of(    "query", "{ some { GraphQL { query } } }");webTestClient.get()    .uri(uriBuilder -> uriBuilder        .path("/v3/callback")        .queryParam("query", "{query}")        .build(requestParams))    .exchange()    .expectStatus()    .isOk();另一个提示。如果您发现.uri(uriBuilder -> ...)语法有点复杂,您可以URI在请求之前显式准备:var requestParams = Map.of(    "query", "{ some { GraphQL { query } } }");URI uri = new DefaultUriBuilderFactory("/v3/callback")    .builder()    .queryParam("query", "{query}")    .build(requestParams);webTestClient.get()    .uri(uri)    .exchange()    .expectStatus()    .isOk();如果事先准备好 -在调试器中URI检查生成的内容或记录它会更容易。URI

子衿沉夜

以下是上述内容的 Kotlin 示例val requestParams = LinkedMultiValueMap<String, String>()requestParams.add("A", "abc")&nbsp; &nbsp; &nbsp;&nbsp;requestParams.add("B", "def")&nbsp; &nbsp; &nbsp; &nbsp;requestParams.add("C", "ghi")&nbsp;val uri = UriComponentsBuilder.fromPath("/v3/callback").queryParams(requestParams).build().toUri()&nbsp; &nbsp;webTestClient.get().uri{uri}.exchange().expectStatus().isOk
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java