Document async requests with Spring MVC Test
Closes gh-19666
This commit is contained in:
parent
4e6e47b726
commit
2088a3d57b
|
|
@ -5115,6 +5115,61 @@ resulting links by using XPath expressions:
|
|||
----
|
||||
====
|
||||
|
||||
|
||||
[[spring-mvc-test-async-requests]]
|
||||
===== Async Requests
|
||||
|
||||
Servlet 3.0 asynchronous requests,
|
||||
<<web.adoc#mvc-ann-async,supported in Spring MVC>>, work by exiting the Servlet container
|
||||
thread and allowing the application to compute the response asynchronously, after which
|
||||
an async dispatch is made to complete processing on a Servlet container thread.
|
||||
|
||||
In Spring MVC Test, async requests can be tested by asserting the produced async value
|
||||
first, then manually performing the async dispatch, and finally verifying the response.
|
||||
Below is an example test for controller methods that return `DeferredResult`, `Callable`,
|
||||
or reactive type such as Reactor `Mono`:
|
||||
|
||||
====
|
||||
[source,java,indent=0]
|
||||
[subs="verbatim,quotes"]
|
||||
----
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
MvcResult mvcResult = this.mockMvc.perform(get("/path"))
|
||||
.andExpect(status().isOk()) <1>
|
||||
.andExpect(request().asyncStarted()) <2>
|
||||
.andExpect(request().asyncResult("body")) <3>
|
||||
.andReturn();
|
||||
|
||||
this.mockMvc.perform(asyncDispatch(mvcResult)) <4>
|
||||
.andExpect(status().isOk()) <5>
|
||||
.andExpect(content().string("body"));
|
||||
}
|
||||
----
|
||||
<1> Check response status is still unchanged
|
||||
<2> Async processing must have started
|
||||
<3> Wait and assert the async result
|
||||
<4> Manually perform an ASYNC dispatch (as there is no running container)
|
||||
<5> Verify the final response
|
||||
|
||||
====
|
||||
|
||||
|
||||
|
||||
|
||||
[[spring-mvc-test-vs-streaming-response]]
|
||||
===== Streaming Responses
|
||||
|
||||
There are no options built into Spring MVC Test for container-less testing of streaming
|
||||
responses. Applications that make use of
|
||||
<<web.adoc#mvc-ann-async-http-streaming,Spring MVC streaming>> options can use the
|
||||
<<testing.adoc#webtestclient-stream,WebTestClient>> to perform end-to-end, integration
|
||||
tests against a running server. This is also supported in Spring Boot where you can
|
||||
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-with-running-server[test a running server]
|
||||
with `WebTestClient`. One extra advantage is the ability to use the `StepVerifier` from
|
||||
project Reactor that allows declaring expectations on a stream of data.
|
||||
|
||||
|
||||
[[spring-mvc-test-server-filters]]
|
||||
===== Filter Registrations
|
||||
|
||||
|
|
@ -5133,26 +5188,13 @@ Registered filters are invoked through the `MockFilterChain` from `spring-test`,
|
|||
last filter delegates to the `DispatcherServlet`.
|
||||
|
||||
|
||||
[[spring-mvc-test-vs-streaming-response]]
|
||||
===== Streaming Responses
|
||||
|
||||
There are no options built into Spring MVC Test for container-less testing of streaming
|
||||
responses. Applications that make use of
|
||||
<<web.adoc#mvc-ann-async-http-streaming,Spring MVC streaming>> options can use the
|
||||
<<testing.adoc#webtestclient-stream,WebTestClient>> to perform end-to-end, integration
|
||||
tests against a running server. This is also supported in Spring Boot where you can
|
||||
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-with-running-server[test a running server]
|
||||
with `WebTestClient`. One extra advantage is the ability to use the `StepVerifier` from
|
||||
project Reactor that allows declaring expectations on a stream of data.
|
||||
|
||||
|
||||
[[spring-mvc-test-vs-end-to-end-integration-tests]]
|
||||
===== Differences Between Out-of-Container and End-to-End Integration Tests
|
||||
===== Spring MVC Test vs End-to-End Tests
|
||||
|
||||
As mentioned earlier Spring MVC Test is built on the Servlet API mock objects from the
|
||||
`spring-test` module and does not use a running Servlet container. Therefore, there are
|
||||
some important differences compared to full end-to-end integration tests with an actual
|
||||
client and server running.
|
||||
Spring MVC Test is built on Servlet API mock implementations from the
|
||||
`spring-test` module and does not rely on a running container. Therefore, there are
|
||||
some differences when compared to full end-to-end integration tests with an actual
|
||||
client and a live server running.
|
||||
|
||||
The easiest way to think about this is by starting with a blank `MockHttpServletRequest`.
|
||||
Whatever you add to it is what the request becomes. Things that may catch you by surprise
|
||||
|
|
@ -5193,7 +5235,7 @@ important thing to check. In short, there is room here for multiple styles and s
|
|||
of testing even within the same project.
|
||||
|
||||
[[spring-mvc-test-server-resources]]
|
||||
===== Further Server-Side Test Examples
|
||||
===== Further Examples
|
||||
|
||||
The framework's own tests include
|
||||
https://github.com/spring-projects/spring-framework/tree/master/spring-test/src/test/java/org/springframework/test/web/servlet/samples[many
|
||||
|
|
|
|||
Loading…
Reference in New Issue