Модульное тестирование Mockito: при всех вызовах метода класса возвращаем «true»

У меня есть класс в kotlin SmsHandler , с методом SmsHandler , который вызывает методы другого класса, SmsSendingFilters :

 class SmsHandler(val filterPredicates: SmsSendingFilters) { fun determineFiltersPass(sms: SmsDto): Boolean = with(sms.filters) { var pass = true for (filter in FiltersDto::class.memberProperties) pass = when (FilterType.valueOf(filter.name.toUpperCase())) { UNIQUE -> if (filter.get(sms.filters) != null) { val unique = filter.get(sms.filters) as Boolean pass && if (unique) filterPredicates.isUnique().test(sms) else true } else pass && true RECENT -> if (filter.get(sms.filters) != null) { pass && filterPredicates.shouldSendByTimePeriodFromLastMessage().test(sms) } else pass && true else -> pass && true } pass } } class SmsSendingFilters { fun isUnique(): Predicate<SmsDto> = Predicate { with(it) { repo.findAllByMessageIdAndMobileNumAndAppIdAndParamMap(messageId!!, mobileNum!!, appId!!, paramMap!!.toString()).isEmpty() } } fun shouldSendByTimePeriodFromLastMessage(): Predicate<SmsDto> = Predicate { val calendar = Calendar.getInstance() calendar.time = Date() with(it.filters.recent ?: "" to "") { val size = this.second.toInt() when (IntervalType.valueOf(this.first.toUpperCase())) { SECOND -> calendar.add(Calendar.SECOND, -1 * size) MINUTE -> calendar.add(Calendar.MINUTE, -1 * size) HOUR -> calendar.add(Calendar.HOUR, -1 * size) MONTH -> calendar.add(Calendar.MONTH, -1 * size) YEAR -> calendar.add(Calendar.YEAR, -1 * size) else -> Unit } with(it) { repo.findAllByMessageIdAndMobileNumAndAppId(messageId!!, mobileNum!!, appId!!) .none { it.dateSent?.toInstant()?.isAfter(calendar.toInstant()) ?: true } } } } } 

Теперь я тестирую класс SmsHandler и, поскольку я предсказываю, что во второй класс будет добавлено больше фильтров, я хочу создать общий макет, который при вызове любого метода из класса SmsSendingFilters вернет true или false как мне заблагорассудится. Есть ли способ сделать это без описания вызова имени каждого метода явно (через отражение, я думаю)?

Я не ищу решение такого рода:

 when(filterPredicates.shouldSendByTimePeriodFromLastMessage().test(any()).thenReturn(true) 

Но что-то, что соответствует этой логике:

 when(filterPredicates.<anyMethodInvoked>().test(any())).thenReturn(true) 

Вы можете зарегистрировать Answer для изменения возвращаемого значения по умолчанию .

Например (используя превосходную обертку mockito-kotlin ):

 interface Thingy { fun foo() : Boolean fun bar() : Boolean } class ThingyTest { @Test fun test() { val t1 = mock<Thingy>(defaultAnswer = Answer { false }) println(t1.foo()) // "false" println(t1.bar()) // "false" val t2 = mock<Thingy>(defaultAnswer = Answer { true }) println(t2.foo()) // "true" println(t2.bar()) // "true" } } 

Конечно, в более сложном случае у вас могут быть методы, которые возвращают разные типы, и в этом случае вам нужно будет сделать что-то умнее в вашей реализации Answer !

Intereting Posts
Как наблюдать данные PagedList? Какой самый элегантный способ удалить слушателя из списка из обратного вызова Почему моя компиляция Kotlin не работает с помощью Kotlin-Maven-Plugin? Котлинский эквивалент Java String.getBytes () Откуда распространяются классы данных Kotlin? Могу ли я увеличить их? Поиск с помощью RxJava не работает RxJava2 как отделить различную реализацию наблюдаемого излучателя Kotlin и javax.validation.constraints.NotNull Ошибка «Переменная должна быть инициализирована» при делегировании инициализированному свойству Kotlin: Что я могу сделать, если в библиотеке Java есть перегрузка как примитивного, так и вложенного типа? Проверьте, нет ли функции в Котлине Преобразуйте MainActivity с помощью панели действий / панели инструментов и кнопки с плавающей точкой в ​​Anko Android показывает, казалось бы, безобидное предупреждение при воспроизведении звука? Продление Cash.State в CORDA Первоначальная инициатива класса Kotlin с аспектом