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
,将返回true
或false
如我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
实现中做些更聪明的事情!