首页 > 解决方案 > io.mockk.MockKException: no answer found for while any() 用作参数

问题描述

目前,我正在进行单元测试,为此我正在使用 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")}
}

这是incidentsBySiteKey函数的签名

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)
   //...
}

eventsBySiteKeyStream函数

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

标签: kotlinmockk

解决方案


推荐阅读