私は、別のクラスのメソッドを呼び出す方法determineFiltersPass
と、kotlin SmsHandler
でクラスを持っているSmsSendingFilters
:Mockitoのユニットテスト:クラスのすべてのメソッド呼び出しに、「真」を返す
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 }
}
}
}
}
、I私はクラスSmsHandler
をテストして、さらに多くのフィルタが2番目のクラスに追加されることを予測しているので、クラスSmsSendingFilters
のメソッドの呼び出し時にtrue
またはfalse
を返す汎用モックを作成したいと思います。各メソッド名の呼び出しを明示的に記述することなく(そう思っていると思いますが)、そうする方法はありますか?
私は、ソートの解決策を探していないよ:
when(filterPredicates.shouldSendByTimePeriodFromLastMessage().test(any()).thenReturn(true)
しかし、このロジックに準拠しています何か:
when(filterPredicates.<anyMethodInvoked>().test(any())).thenReturn(true)
迅速な対応をありがとうございます。私は明日仕事でそれを試してみます:D – MaxG