Mockitounit testing:在一个类的所有方法调用中,返回“true”

我在kotlin SmsHandler有一个类,使用一个方法determineFiltersPass调用另一个类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 = Predicate { with(it) { repo.findAllByMessageIdAndMobileNumAndAppIdAndParamMap(messageId!!, mobileNum!!, appId!!, paramMap!!.toString()).isEmpty() } } fun shouldSendByTimePeriodFromLastMessage(): Predicate = 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类,因为我预测更多的filter将被添加到第二个类,我想创建一个通用的模拟,调用任何方法从类SmsSendingFilters ,将返回truefalse如我SmsSendingFilters 。 有没有这样做的方式没有明确描述每个方法名称的调用(通过reflection我猜)?

我不是在寻找一种解决方案:

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

但是,符合这个逻辑的东西:

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

您可以注册一个Answer来更改默认返回值 。

例如(使用优秀的mockito-kotlin包装):

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

当然,在一个更复杂的情况下,你可能会有返回不同types的方法,在这种情况下,你需要在你的Answer实现中做些更聪明的事情!