溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么創(chuàng)建WebTestClient

發(fā)布時(shí)間:2021-12-22 11:56:53 來(lái)源:億速云 閱讀:160 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“怎么創(chuàng)建WebTestClient”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

WebTestClient

WebTestClient是圍繞WebClient的薄殼,可用于執(zhí)行請(qǐng)求并公開(kāi)專用的流利API來(lái)驗(yàn)證響應(yīng)。 WebTestClient通過(guò)使用模擬請(qǐng)求和響應(yīng)綁定到WebFlux應(yīng)用程序,或者它可以通過(guò)HTTP連接測(cè)試任何Web服務(wù)器。

3.7.1 安裝

要?jiǎng)?chuàng)建WebTestClient,必須選擇多個(gè)服務(wù)器設(shè)置選項(xiàng)之一。實(shí)際上,你是在配置WebFlux應(yīng)用程序以綁定到該URL,還是使用URL連接到正在運(yùn)行的服務(wù)器。

綁定到控制器

以下示例顯示如何創(chuàng)建服務(wù)器設(shè)置以一次測(cè)試一個(gè)@Controller

client = WebTestClient.bindToController(new TestController()).build();

前面的示例加載WebFlux Java配置并注冊(cè)給定的控制器。使用模擬請(qǐng)求和響應(yīng)對(duì)象,可以在沒(méi)有HTTP服務(wù)器的情況下測(cè)試生成的WebFlux應(yīng)用程序。構(gòu)建器上有更多方法可以定制默認(rèn)WebFlux Java配置。

綁定到路由器功能

以下示例顯示了如何通過(guò)RouterFunction設(shè)置服務(wù)器:

RouterFunction<?> route = ...
client = WebTestClient.bindToRouterFunction(route).build();

在內(nèi)部,配置被傳遞到RouterFunctions.toWebHandler。使用模擬請(qǐng)求和響應(yīng)對(duì)象,可以在沒(méi)有HTTP服務(wù)器的情況下測(cè)試生成的WebFlux應(yīng)用程序。

綁定到ApplicationContext

以下示例顯示了如何通過(guò)應(yīng)用程序或其部分子集的Spring配置來(lái)設(shè)置服務(wù)器:

@SpringJUnitConfig(WebConfig.class) //1
class MyTests {

    WebTestClient client;

    @BeforeEach
    void setUp(ApplicationContext context) {  //2
        client = WebTestClient.bindToApplicationContext(context).build(); //3
    }
}
  1. 指定要加載的配置

  2. 注入配置

  3. 創(chuàng)建WebTestClient

在內(nèi)部,配置被傳遞到WebHttpHandlerBuilder以建立請(qǐng)求處理鏈。有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)WebHandler API。使用模擬請(qǐng)求和響應(yīng)對(duì)象,可以在沒(méi)有HTTP服務(wù)器的情況下測(cè)試生成的WebFlux應(yīng)用程序。

綁定到服務(wù)器

以下服務(wù)器設(shè)置選項(xiàng)使你可以連接到正在運(yùn)行的服務(wù)器:

client = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build();

客戶端構(gòu)建者

除了前面介紹的服務(wù)器設(shè)置選項(xiàng)之外,你還可以配置客戶端選項(xiàng)、包括基本URL、默認(rèn)標(biāo)頭,客戶端過(guò)濾器等。這些選項(xiàng)在bindToServer之后很容易獲得。對(duì)于所有其他服務(wù)器,你需要使用configureClient()從服務(wù)器配置過(guò)渡到客戶端配置,如下所示:

client = WebTestClient.bindToController(new TestController())
        .configureClient()
        .baseUrl("/test")
        .build();

3.7.2 寫測(cè)試

WebTestClient提供了與WebClient相同的API,直到使用exchange()執(zhí)行請(qǐng)求為止。 exchange()之后是鏈接的API工作流,用于驗(yàn)證響應(yīng)。

通常,首先聲明響應(yīng)狀態(tài)和標(biāo)頭,如下所示:

client.get().uri("/persons/1")
            .accept(MediaType.APPLICATION_JSON)
            .exchange()
            .expectStatus().isOk()
            .expectHeader().contentType(MediaType.APPLICATION_JSON)

然后,你指定如何解碼和使用響應(yīng)主體:

  • ExpectBody(Class <T>):解碼為單個(gè)對(duì)象。

  • ExpectBodyList(Class <T>):解碼并將對(duì)象收集到List <T>。

  • ExpectBody():解碼為byte []以獲取JSON內(nèi)容或一個(gè)空的正文。

然后,你可以為主體使用內(nèi)置的斷言。以下示例顯示了一種方法:

client.get().uri("/persons")
        .exchange()
        .expectStatus().isOk()
        .expectBodyList(Person.class).hasSize(3).contains(person);

你還可以超越內(nèi)置的斷言并創(chuàng)建自己的斷言,如以下示例所示:

import org.springframework.test.web.reactive.server.expectBody

client.get().uri("/persons/1")
        .exchange()
        .expectStatus().isOk()
        .expectBody(Person.class)
        .consumeWith(result -> {
            // custom assertions (e.g. AssertJ)...
        });

你還可以退出工作流程并獲得結(jié)果,如下所示:

EntityExchangeResult<Person> result = client.get().uri("/persons/1")
        .exchange()
        .expectStatus().isOk()
        .expectBody(Person.class)
        .returnResult();

當(dāng)你需要使用泛型解碼為目標(biāo)類型時(shí),請(qǐng)尋找接受ParameterizedTypeReference而不是Class <T>的重載方法。

無(wú)內(nèi)容

如果響應(yīng)沒(méi)有內(nèi)容(或者你不在乎),請(qǐng)使用Void.class,以確保釋放資源。以下示例顯示了如何執(zhí)行此操作:

client.get().uri("/persons/123")
        .exchange()
        .expectStatus().isNotFound()
        .expectBody(Void.class);

或者,如果要斷言沒(méi)有響應(yīng)內(nèi)容,則可以使用類似于以下內(nèi)容的代碼:

client.post().uri("/persons")
        .body(personMono, Person.class)
        .exchange()
        .expectStatus().isCreated()
        .expectBody().isEmpty();

JSON內(nèi)容

當(dāng)你使用ExpectBody()時(shí),響應(yīng)以byte[]的形式使用。這對(duì)于原始內(nèi)容聲明很有用。例如,你可以使用JSONAssert來(lái)驗(yàn)證JSON內(nèi)容,如下所示:

client.get().uri("/persons/1")
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .json("{\"name\":\"Jane\"}")

你還可以使用JSONPath表達(dá)式,如下所示:

client.get().uri("/persons")
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$[0].name").isEqualTo("Jane")
        .jsonPath("$[1].name").isEqualTo("Jason");

流式響應(yīng)

要測(cè)試無(wú)限流(例如,“ text/event-stream”或“ application/stream + json”),你需要在響應(yīng)狀態(tài)和響應(yīng)頭斷言之后立即退出鏈接的API(通過(guò)使用returnResult),如下所示示例顯示:

FluxExchangeResult<MyEvent> result = client.get().uri("/events")
        .accept(TEXT_EVENT_STREAM)
        .exchange()
        .expectStatus().isOk()
        .returnResult(MyEvent.class);

現(xiàn)在,你可以使用Flux <T>,在到達(dá)解碼對(duì)象時(shí)對(duì)其進(jìn)行斷言,然后在達(dá)到測(cè)試目標(biāo)時(shí)在某個(gè)時(shí)候取消。我們建議使用反應(yīng)堆測(cè)試模塊中的StepVerifier進(jìn)行此操作,如以下示例所示:

Flux<Event> eventFlux = result.getResponseBody();

StepVerifier.create(eventFlux)
        .expectNext(person)
        .expectNextCount(4)
        .consumeNextWith(p -> ...)
        .thenCancel()
        .verify();

請(qǐng)求體

當(dāng)涉及到構(gòu)建請(qǐng)求時(shí),WebTestClient提供了與WebClient相同的API,實(shí)現(xiàn)主要是簡(jiǎn)單的傳遞。

“怎么創(chuàng)建WebTestClient”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI