Моккито издевается над созданием

Ошибка, которую я получаю, это org.mockito.exceptions.misusing.UnfinishedStubbingException , с одной из возможных причин: «вы завершаете поведение другого макета внутри до« thenReturn », если оно завершено».

  val mockHttpHandlerContext = mock<HttpHandlerContext>().let { whenever(it.request).thenReturn(mock<HttpRequest>().let { whenever(it.queryParameters).thenReturn(mapOf( "itype" to listOf("msisdn"), "uid" to listOf(inputMsisdn) )) it }) whenever(it.scope()).thenReturn(ProcessingScope.of(Timings("test", 1000L))) it } ,  val mockHttpHandlerContext = mock<HttpHandlerContext>().let { whenever(it.request).thenReturn(mock<HttpRequest>().let { whenever(it.queryParameters).thenReturn(mapOf( "itype" to listOf("msisdn"), "uid" to listOf(inputMsisdn) )) it }) whenever(it.scope()).thenReturn(ProcessingScope.of(Timings("test", 1000L))) it } 

Единственное решение избавиться от вложенного макетного создания? Это действительно затруднит понимание кода, возможно, существует известное обходное решение?

Фрагмент кода – Kotlin.

Судя по названию, я предполагаю, что вы используете nhaarman / Mockito-Kotlin ?

Mockito – это состояние, вы должны создавать mocks последовательно, но есть некоторые способы перебросить порядок оценки. Например,

 val mockHttpHandlerContext2 = mock<HttpHandlerContext>() { mock<HttpRequest>() { on { queryParameters }.thenReturn(mapOf( "itype" to listOf("msisdn"), "uid" to listOf(inputMsisdn) )) }.let { on { request }.thenReturn(it) } on { scope() }.thenReturn(ProcessingScope.of(Timings("test", 1000L))) } 

Я использую перегрузку mock() с помощью KStubbing<T> , но важный бит создает внутренний макет перед использованием .let чтобы установить его на заглушку.

Другим вариантом было бы использовать .thenAnswer чтобы отложить создание внутреннего макета до тех пор, пока не будет вызван метод .thenAnswer .

 val mockHttpHandlerContext = mock<HttpHandlerContext>() { on { request }.thenAnswer { mock<HttpRequest>() { on { queryParameters }.thenReturn(mapOf( "itype" to listOf("msisdn"), "uid" to listOf(inputMsisdn) )) } } on { scope() }.thenReturn((ProcessingScope.of(Timings("test", 1000L))) } 

Обратите внимание: это будет создавать новый макет при каждом вызове метода stubbed. Это может быть нежелательно в некоторых ситуациях, например, если вы хотите выполнить проверку на внутреннем макет.

Intereting Posts
Как сделать постоянную времени компиляции NaN или POSITIVE_INFINITY в Котлине? Как установить метод тестового презентатора на основе возвращаемого значения Observable? JNI GetShortArrayElements не работает с SIGSEGV SEGV_ACCERR Как я могу прочитать уникальный ключ, предоставленный firebase? Неустранимое исключение, если оно не подключено к Интернету В Котлине не работает почтовая служба, что не так Каков правильный способ получения разрешений для намерений телефонных звонков RxAndroid – обращение к ошибкам с помощью оператора Zip В Android Java / Kotlin реализация интерфейса дает ему прямой доступ к локальным переменным класса вложенности Как объявить переменную типа перечисления в Kotlin? Как установить обработчик кликов в динамическом списке (в tornadofx) Всплывающее диалоговое окно завершения работы Kotlin после ввода «объекта». Databinding и BaseObserver – Android MVVM Замок Kotlin подстановочного знака в параметре обратного вызова списка Kotlin конвертирует TimeStamp в DateTime