2 changed files with 12 additions and 35 deletions
@ -1,38 +1,15 @@
@@ -1,38 +1,15 @@
|
||||
[[spring-mvc-test-vs-streaming-response]] |
||||
= Streaming Responses |
||||
|
||||
The best way to test streaming responses such as Server-Sent Events is through the |
||||
<<WebTestClient>> which can be used as a test client to connect to a `MockMvc` instance |
||||
to perform tests on Spring MVC controllers without a running server. For example: |
||||
|
||||
[tabs] |
||||
====== |
||||
Java:: |
||||
+ |
||||
[source,java,indent=0,subs="verbatim,quotes",role="primary"] |
||||
---- |
||||
WebTestClient client = MockMvcWebTestClient.bindToController(new SseController()).build(); |
||||
|
||||
FluxExchangeResult<Person> exchangeResult = client.get() |
||||
.uri("/persons") |
||||
.exchange() |
||||
.expectStatus().isOk() |
||||
.expectHeader().contentType("text/event-stream") |
||||
.returnResult(Person.class); |
||||
|
||||
// Use StepVerifier from Project Reactor to test the streaming response |
||||
|
||||
StepVerifier.create(exchangeResult.getResponseBody()) |
||||
.expectNext(new Person("N0"), new Person("N1"), new Person("N2")) |
||||
.expectNextCount(4) |
||||
.consumeNextWith(person -> assertThat(person.getName()).endsWith("7")) |
||||
.thenCancel() |
||||
.verify(); |
||||
---- |
||||
====== |
||||
|
||||
`WebTestClient` can also connect to a live server and perform full end-to-end integration |
||||
tests. This is also supported in Spring Boot where you can |
||||
{docs-spring-boot}/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-with-running-server[test a running server]. |
||||
|
||||
You can use `WebTestClient` to test xref:testing/webtestclient.adoc#webtestclient-stream[streaming responses] |
||||
such as Server-Sent Events. However, `MockMvcWebTestClient` doesn't support infinite |
||||
streams because there is no way to cancel the server stream from the client side. |
||||
To test infinite streams, you'll need to |
||||
xref:testing/webtestclient.adoc#webtestclient-server-config[bind to] a running server, |
||||
or when using Spring Boot, |
||||
{docs-spring-boot}/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-with-running-server[test with a running server]. |
||||
|
||||
`MockMvcWebTestClient` does support asynchronous responses, and even streaming responses. |
||||
The limitation is that it can't influence the server to stop, and therefore the server |
||||
must finish writing the response on its own. |
||||
|
||||
|
||||
Loading…
Reference in new issue