您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么創(chuàng)建WebTestClient”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
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ù)器。
要?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 } }
指定要加載的配置
注入配置
創(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();
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í)用文章!
免責(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)容。