spring-test добавил поддержку для DSL MockMvc, которую можно найти здесь, в документации:
https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/languages.html#mockmvc-dsl
При тестировании контроллера, который возвращает CompletableFuture (или любой другой тип асинхронного результата), тест с использованием MockMvc должен выполнить asyncDispatch MvcResult, прежде чем тело может быть утверждено.
Это можно найти в различных блогах или в вопросах о переполнении стека:
Кажется, в новом DSL нет чистого способа сделать это.
Например, для выполнения asyncDispatch необходим следующий код:
@Test
internal fun call() {
val mvcResult = mockMvc.get("/execute") {
accept = APPLICATION_JSON
}.andExpect {
request { asyncStarted() }
}.andReturn()
mockMvc.perform(asyncDispatch(mvcResult))
.andExpect(MockMvcResultMatchers.status().isOk)
.andExpect(MockMvcResultMatchers.jsonPath("$.value", Is.`is`("test")))
}
Я что-то упустил, что могло бы включить это, или это просто не поддерживается в DSL (пока)?
Обновление:
Я попытался улучшить это с помощью функции расширения ResultActionsDsl.
fun ResultActionsDsl.asyncDispatch(mockMvc: MockMvc):ResultActionsDsl {
val mvcResult = andReturn()
mockMvc.perform(MockMvcRequestBuilders.asyncDispatch(mvcResult))
return this
}
Это позволяет записать тест как:
@Test
internal fun call() {
mockMvc.get("/execute") {
accept = APPLICATION_JSON
}.andExpect {
request {
asyncStarted()
}
}
.asyncDispatch(mockMvc)
.andExpect {
status { isOk }
jsonPath("$.value") { value("test") }
}
}
Я все еще чувствую, что DSL будет поддерживать его из коробки.