Kotlin Mockk 错误:验证 { ... } 块内缺少调用

Kotlin Mockk Error: Missing calls inside verify { ... } block

提问人:muetzenflo 提问时间:2/20/2020 最后编辑:muetzenflo 更新时间:4/14/2022 访问量:25066

问:

我已经阅读了有关此错误消息或类似错误消息的一些问题(每个 {} 也都会出现),但它们都没有让我获得成功的结果。

关于如何使其工作的任何提示或建议?

这是我的设置和单元测试本身:

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()testDispatcherTestCoroutineDispatcher()

更新/回答

多亏了 @Juan Cruy Soler 的输入,我改变了注入数据库的方式。我没有返回真实的房间数据库,而是返回了它的间谍。这样,间谍就会被注入到 SUT 和我的测试类中。更改后,测试按摘录的方式运行。这是我问题的可行解决方案吗?让 (Testing-)DependencyInjection 创建间谍有意义吗?

单元测试 Kotlin Android测试 mockk

评论


答:

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>()

这样做,您将能够使用函数。