Intereting Posts
Как помещать выражение лямбда после параметров на mapTo вызвать юридический синтаксис? Kotlin – Невозможно использовать параметр T в качестве параметра типа reified. Вместо этого используйте класс Оператор, новый в Kotlin (синтаксис) Android, тест Espresso не может работать с записью активности на Kotlin Предоставляет ли Kotlin какие-либо реализации своих интерфейсов сбора данных? Возвращаемое значение Kotlin возвращает значение в firebase Как отличить глобальную переменную от локального с тем же именем в Kotlin? Как показать диалог «Прогресс» и «Отклонить» Плохой тип в стеке операндов с сопрограммами Kotlin Объявление поля POJO, значение init или null Как реализовать общую функцию интерфейса в Котлин? Миграция Groovy gradle до градиента Kotlin (исключение отсутствующего или закрытие, не уверен) Плагин Maven-publish gradle пропускает версию Java – общий для Kotlin generic. Возвращать общий метод Как заставить вызовы некоторым конструкторам / функциям использовать именованные аргументы?

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

Ошибка, которую я получаю, это 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. Это может быть нежелательно в некоторых ситуациях, например, если вы хотите выполнить проверку на внутреннем макет.