В настоящее время я работаю над юнит-тестами и для этой цели использую Mockk.
Вот как выглядит мой юнит-тест (я поставлю самые важные строки)
@Test
fun `Test computeDowntimesOverPeriod with starting uptime`() {
every {incidentRepository.incidentsBySiteKey(any(), any(), or(ofType(String::class), isNull()))} returns buildIncidentsStream(5)
mockSAT123Mapping()
val timeIntervals = incidentManager.computeDowntimesOverPeriod("SAT.123", Period.ofWeeks(1))
//...
verify(exactly=1) {incidentRepository.incidentsBySiteKey(Period.ofDays(7),15, "asc")}
}
Вот подпись функции инцидентовBySiteKey
fun incidentsBySiteKey(period: Period, siteId: Int?, order: String = "asc"): Stream<Incident>
Для computeDowntimesOverPeriod функции
open fun computeDowntimesOverPeriod(siteKey: String, period: Period): List<StatusTimeInterval> {
//...
val downtimes = incidentsBySiteKeyStream(siteKey, period)
//...
}
инцидентовBySiteKeyStream function:
private fun incidentsBySiteKeyStream(siteKey: String, period: Period, order: String = "asc"): Optional<Stream<Incident>> {
Objects.requireNonNull(period)
return if (StringUtils.isEmpty(siteKey)) {
Optional.of(Stream.empty())
} else siteMapper.fromCMMSKey(siteKey)
.flatMap { it.toUtId() }
.map { siteId -> incidentRepository.incidentsBySiteKey(period, siteId, order).filter { equipmentRepository.findById(it.equipmentId).get().weight > 0 } }
}
Как вы можете видеть, в функции computeDowntimesOverPeriod мы используем функцию incidentsBySiteKey . Итак, в тесте логично проверить, вызывается ли функция. Но когда я запускаю тест, я получаю следующую ошибку:
io.mockk.MockKException: no answer found for: IncidentRepository(incidentRepository#28).incidentsBySiteKey(P7D, 15, asc)
Таким образом, мой тест не удался, когда я инициализировал переменную timeIntervals . Но почему ? Я имею в виду, у меня есть каждый блок, который должен возвращать что-то для любого аргумента.
Редактировать: версия kotlin => версия 1.3.31 mockk => 1.8.13.kotlin13