diff --git a/spring-test/src/main/kotlin/org/springframework/test/web/servlet/MockHttpServletRequestDsl.kt b/spring-test/src/main/kotlin/org/springframework/test/web/servlet/MockHttpServletRequestDsl.kt index 643a32882cbffd29c4424286eac4ff4d2d7f818f..7226d319b750272d745915307d7b1269de7d9e91 100644 --- a/spring-test/src/main/kotlin/org/springframework/test/web/servlet/MockHttpServletRequestDsl.kt +++ b/spring-test/src/main/kotlin/org/springframework/test/web/servlet/MockHttpServletRequestDsl.kt @@ -204,6 +204,6 @@ open class MockHttpServletRequestDsl(private val builder: MockHttpServletRequest flashAttrs?.also { builder.flashAttrs(flashAttrs!!) } session?.also { builder.session(session!!) } principal?.also { builder.principal(principal!!) } - return ResultActionsDsl(mockMvc.perform(builder)) + return ResultActionsDsl(mockMvc.perform(builder), mockMvc) } } diff --git a/spring-test/src/main/kotlin/org/springframework/test/web/servlet/ResultActionsDsl.kt b/spring-test/src/main/kotlin/org/springframework/test/web/servlet/ResultActionsDsl.kt index 43c639742a2049b8cf025a5d29eaa014a8ff37b3..5c54df36d32727f0e3487f9401bd01e8b81e1acf 100644 --- a/spring-test/src/main/kotlin/org/springframework/test/web/servlet/ResultActionsDsl.kt +++ b/spring-test/src/main/kotlin/org/springframework/test/web/servlet/ResultActionsDsl.kt @@ -1,12 +1,14 @@ package org.springframework.test.web.servlet +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders + /** * Provide a [ResultActions] Kotlin DSL in order to be able to write idiomatic Kotlin code. * * @author Sebastien Deleuze * @since 5.2 */ -class ResultActionsDsl(private val actions: ResultActions) { +class ResultActionsDsl(private val actions: ResultActions, private val mockMvc: MockMvc) { /** * Provide access to [MockMvcResultMatchersDsl] Kotlin DSL. @@ -26,6 +28,19 @@ class ResultActionsDsl(private val actions: ResultActions) { return this } + /** + * Enable asynchronous dispatching. + * @see MockMvcRequestBuilders.asyncDispatch + * @since 5.2.2 + */ + fun asyncDispatch(): ResultActionsDsl { + return andExpect { + request { asyncStarted() } + }.andReturn().let { + ResultActionsDsl(mockMvc.perform(MockMvcRequestBuilders.asyncDispatch(it)), mockMvc) + } + } + /** * @see ResultActions.andReturn */ diff --git a/spring-test/src/test/kotlin/org/springframework/test/web/servlet/MockMvcExtensionsTests.kt b/spring-test/src/test/kotlin/org/springframework/test/web/servlet/MockMvcExtensionsTests.kt index 2ac5accb3af712ab730d0fdac3ce3e56e56da81a..9729c10ec9679a1be2ff816fe3d3e75ae2004ee5 100644 --- a/spring-test/src/test/kotlin/org/springframework/test/web/servlet/MockMvcExtensionsTests.kt +++ b/spring-test/src/test/kotlin/org/springframework/test/web/servlet/MockMvcExtensionsTests.kt @@ -25,6 +25,7 @@ import org.springframework.http.MediaType.* import org.springframework.test.web.Person import org.springframework.test.web.servlet.setup.MockMvcBuilders import org.springframework.web.bind.annotation.* +import reactor.core.publisher.Mono import java.security.Principal import java.util.* @@ -153,6 +154,13 @@ class MockMvcExtensionsTests { } } + @Test + fun asyncDispatch() { + mockMvc.get("/async").asyncDispatch().andExpect { + status { isOk } + } + } + @RestController private class PersonController { @@ -166,5 +174,10 @@ class MockMvcExtensionsTests { @PostMapping("/person") @ResponseStatus(HttpStatus.CREATED) fun post(@RequestBody person: Person) {} + + @GetMapping("/async") + fun getAsync(): Mono { + return Mono.just(Person("foo")) + } } }