весеннему тесту MockMvc kotlin DSL не хватает поддержки асинхронности? - PullRequest
0 голосов
/ 30 апреля 2019

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 будет поддерживать его из коробки.

...