目前,我正在进行单元测试,并且正在为此目的使用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)
//...
}
incidentsBySiteKeyStream 函数:
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 模拟版本=> 1.8.13.kotlin13