Kotlin Mockk Error: Missing calls inside verify { ... } block
Kotlin Mockk Error: Missing calls inside verify { ... } block
我已经阅读了一些关于此错误消息或类似错误消息的问题(每个 {} 也会出现这种情况),但 none 使我获得了成功结果。
关于如何让它工作的任何提示或建议?
这是我的设置和单元测试本身:
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() }
}
}
我不知道我在这里做错了什么。 database.clearAllTables()
是Room提供的方法。 testDispatcher
是androidx测试库提供的TestCoroutineDispatcher()
。
更新/回答
感谢@Juan Cruy Soler 的帮助,我改变了注入数据库的方式。我没有 return 真正的房间数据库,而是 return 它的一个间谍。这样,间谍就会被注入 SUT 以及我的测试 class。更改后,测试按预期运行。这是我的问题的可行解决方案吗?让 (Testing-)DependencyInjection 创建间谍有意义吗?
database
应该是 mock 或 spy 来调用验证它。
我认为这不是模拟,因为您在前一行中调用了方法 dataDao()
。
- 如果你不想模拟它,你可以使用真实的数据库,检查
database.dataDao().getData()
returns 一个空列表并删除 verify
行。
- 如果你嘲笑它,那么你可以删除这一行
database.dataDao().insert(listOf(DataDummies()))
您应该使用spyk
来模拟真实场景。
val database = spyk<YouDataBaseReference>()
这样,您就可以使用函数了。
我已经阅读了一些关于此错误消息或类似错误消息的问题(每个 {} 也会出现这种情况),但 none 使我获得了成功结果。
关于如何让它工作的任何提示或建议?
这是我的设置和单元测试本身:
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() }
}
}
我不知道我在这里做错了什么。 database.clearAllTables()
是Room提供的方法。 testDispatcher
是androidx测试库提供的TestCoroutineDispatcher()
。
更新/回答
感谢@Juan Cruy Soler 的帮助,我改变了注入数据库的方式。我没有 return 真正的房间数据库,而是 return 它的一个间谍。这样,间谍就会被注入 SUT 以及我的测试 class。更改后,测试按预期运行。这是我的问题的可行解决方案吗?让 (Testing-)DependencyInjection 创建间谍有意义吗?
database
应该是 mock 或 spy 来调用验证它。
我认为这不是模拟,因为您在前一行中调用了方法 dataDao()
。
- 如果你不想模拟它,你可以使用真实的数据库,检查
database.dataDao().getData()
returns 一个空列表并删除verify
行。 - 如果你嘲笑它,那么你可以删除这一行
database.dataDao().insert(listOf(DataDummies()))
您应该使用spyk
来模拟真实场景。
val database = spyk<YouDataBaseReference>()
这样,您就可以使用函数了。