为了账号安全,请及时绑定邮箱和手机立即绑定

带查询参数的 Spring webflux WebTestClient

带查询参数的 Spring webflux WebTestClient

临摹微笑 2023-11-01 21:04:53
在我的 webflux 应用程序中,我有这个GET端点v3/callback?state=cGF5bWVudGlkPTRiMmZlMG我正在尝试使用编写集成测试WebTestClient@Testpublic 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?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您可以利用UriBuilder.


webTestClient.get()

            .uri(uriBuilder ->

                    uriBuilder

                            .path("/v3/callback")

                            .queryParam("state", "cGF5bWVudGlkPTRiMmZlMG")

                            .build())

            .exchange()

            .expectStatus()

            .isOk();

这应该有效。



查看完整回答
反对 回复 2023-11-01
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如果您的查询参数值包含大括号,例如如下所示:


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


查看完整回答
反对 回复 2023-11-01
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

以下是上述内容的 Kotlin 示例


val requestParams = LinkedMultiValueMap<String, String>()

requestParams.add("A", "abc")      

requestParams.add("B", "def")       

requestParams.add("C", "ghi")

 

val uri = UriComponentsBuilder.fromPath("/v3/callback").queryParams(requestParams).build().toUri()   


webTestClient.get().uri{uri}.exchange().expectStatus().isOk


查看完整回答
反对 回复 2023-11-01
  • 3 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信