提问人:muetzenflo 提问时间:2/20/2020 最后编辑:muetzenflo 更新时间:4/14/2022 访问量:25066
Kotlin Mockk 错误:验证 { ... } 块内缺少调用
Kotlin Mockk Error: Missing calls inside verify { ... } block
问:
我已经阅读了有关此错误消息或类似错误消息的一些问题(每个 {} 也都会出现),但它们都没有让我获得成功的结果。
关于如何使其工作的任何提示或建议?
这是我的设置和单元测试本身:
compileSdkVersion 29
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
MockK version: 1.9.3.kotlin12
OS: Android
Kotlin version: 1.3.61
JDK version: jdk1.8.0_212
JUnit version: 4.12
Type of test: unit test
错误的堆栈跟踪:
io.mockk.MockKException: Missing calls inside verify { ... } block.
at io.mockk.impl.recording.states.VerifyingState.checkMissingCalls(VerifyingState.kt:52)
at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:21)
at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
at io.mockk.MockKDsl.internalVerify(API.kt:118)
at io.mockk.MockKKt.verify(MockK.kt:139)
at io.mockk.MockKKt.verify$default(MockK.kt:136)
我的单元测试:
@Test
fun logout_clearsDatabase() {
coroutineTestRule.testDispatcher.runBlockingTest {
// ARRANGE
database.dataDao().insert(listOf(DataDummies()))
// ACT
sut.logout()
// ASSERT
verify { database.clearAllTables() }
}
}
我不知道我在这里做错了什么。 是 Room 提供的方法。这是由 androidx 测试库提供的。database.clearAllTables()
testDispatcher
TestCoroutineDispatcher()
更新/回答
多亏了 @Juan Cruy Soler 的输入,我改变了注入数据库的方式。我没有返回真实的房间数据库,而是返回了它的间谍。这样,间谍就会被注入到 SUT 和我的测试类中。更改后,测试按摘录的方式运行。这是我问题的可行解决方案吗?让 (Testing-)DependencyInjection 创建间谍有意义吗?
答:
20赞
Juan Cruz Soler
2/20/2020
#1
database
应该是模拟或间谍来调用验证它。
我认为这不是模拟,因为您在上一行中调用了该方法。dataDao()
- 如果你不想嘲笑它,你可以改用一个真正的数据库,检查返回一个空列表并删除该行。
database.dataDao().getData()
verify
- 如果你嘲笑它,那么你可以删除这一行
database.dataDao().insert(listOf(DataDummies()))
评论
0赞
muetzenflo
2/20/2020
这是一个很好的提示,谢谢!我更新了我的答案以解释当前的解决方案,如果它有意义,我会喜欢一两句话。
1赞
Juan Cruz Soler
2/20/2020
我宁愿不使用 spy 并使用数据库提供的方法来测试它是否为空。但这是一个有效的解决方案
4赞
Jhonatan Sabadi
5/15/2020
#2
您应该用于模拟真实场景。spyk
val database = spyk<YouDataBaseReference>()
这样做,您将能够使用函数。
评论