我很惊讶未能找到这个问题的答案。我有一个尝试读取文件的方法,如果找不到该文件,则有可能抛出IOException:
@Throws(IOException::class)
open fun readCurrentTemperature(): Int {
FileInputStream(coreTemperatureFile).use { inputStream ->
BufferedReader(InputStreamReader(inputStream)).use { reader ->
//get the first line from the file
return Integer.parseInt(reader.readLine()) / CONVERT_MILLISECONDS_TO_SECONDS //The coreTemp file appears to be measured in millidegrees
}
}
}
非常简单。我试图将这个方法存根到一个间谍对象上。根据包含间谍对象的文档,除非已将其存根,否则将执行真实方法。我这样做的方法如下:
Mockito.doReturn(40).`when`(subject).readCurrentTemperature()
我看到的是该方法仍在执行,因为它抛出IOException,因为在运行测试的环境中该文件不存在。我有逻辑可以在类中处理该异常。我正在监视,但我想测试处理返回的正确值的逻辑。关于为什么该方法仍在执行的任何想法?
编辑
更多情况下,我正在测试的逻辑在RX链中:
bitService.bitEventStream
.map {
try {
readCurrentTemperature()
} catch (e: IOException) {
// If exception is thrown return known error number
IO_ERROR_DEFAULT_TEMPERATURE
}
}
整个测试如下:
@Test
@Throws(IOException::class)
fun checkTemperatureNormal() {
setMockSeat()
Mockito.doReturn(40).`when`(subject).readCurrentTemperature()
bridge.bitObserver.onNext(BitEvent.RunBit)
}
bitObserver和bitEventStream是相同的PublishSubject。这是设置方法的片段:
bridge = Mockito.mock(BasicBitBridge::class.java)
var publishSubject = PublishSubject.create<BitEvent>()
Mockito.doReturn(publishSubject).`when`(bridge).bitEventStream
Mockito.doReturn(publishSubject).`when`(bridge).bitObserver
subject = Mockito.spy(TemperatureBIT(server, seatProvider, bridge))
因此,为了测试逻辑,我发出了BitEvent。我看到代码总是转到IOException的处理程序。
编辑2
从注释中获取建议,我只是将方法放置在另一个类中,并且能够模拟返回值,因为该类未被监视。我仍然很好奇为什么以前的实现方法打破了文档所说的应该发生的情况。很想知道发生了什么事。