Как имитировать веб-клиент в Kotlin и весеннюю загрузку для модульных тестов с помощью mockk framework? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующий фрагмент кода в Kotlin (с использованием WebFlux), который я хочу протестировать:

   fun checkUser(user: People.User?): Mono<Unit> =
            if (user==null) {
                Mono.empty()
            } else {
                webClient.get().uri {
                    uriBuilder -> uriBuilder
                    //... building a URI

                }.retrieve().bodyToMono(UserValidationResponse::class.java)
                        .doOnError {
                            //log something
                       }.map {
                            if (!item.isUserValid()) {
                                throw InvalidUserException()
                            }
                        }
            }

Мой модульный тест пока выглядит так:

@Test
fun `Returns error when user is invalid`() {
    val user = People.User("name", "lastname", "street", "zip code")
    //when
    StepVerifier.create(checkUser(user))
            //then
            .expectError(InvalidUserException::class.java)
            .verify()
}

Однако, когда я запускаю его, он выдает следующую ошибку:

io.mockk.MockKException: no answer found for: WebClient(#1).get()

    at io.mockk.impl.stub.MockKStub.defaultAnswer(MockKStub.kt:90)
    at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42)
    at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
    at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:53)
    at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:263)
    at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:25)
    at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)

Я предполагаю, что ошибка возникает, потому что я не издевался над WebClient(#1).get(), но я не уверен, как имитировать его. До сих пор я пробовал:

every { webClient.get() } returns WebClient.RequestHeadersUriSpec

, но он не компилируется. Ошибка говорит:

Classifier 'RequestHeadersUriSpec' does not have a companion object, and thus must be initialized here

Кто-то знает, как я могу издеваться над WebClient(#1).get()? Заранее спасибо

1 Ответ

0 голосов
/ 18 июня 2020

В основном вам нужно что-то вроде этого:

  • mock ResponseSpec - имитируйте тело или ошибку любым способом, который вам нужен для соответствующего тестового примера
  • mock RequestHeadersUriSpec - пусть метод retrieve() возвращает ResponseSpec mock
  • mock WebClient - пусть метод get() возвращает RequestHeadersUriSpec mock

Вот полный пример:

val response = mockk<WebClient.ResponseSpec>()
val spec = mockk<WebClient.RequestHeadersUriSpec<*>>()
val client = mockk<WebClient>()

every { response.bodyToMono(String::class.java) } returns Mono.just("Hello StackOverflow")
every { spec.retrieve() } returns response
every { client.get() } returns spec

println(client.get().retrieve().bodyToMono(String::class.java).block())

Это правильно напечатает строку Hello StackOverflow.

...