MockK 捕获挂起的 lambda/协程

问题描述 投票:0回答:2

我试图捕获挂起的 lambda/协程并调用它,但模拟调用只是挂起。

@Test
fun test() = coroutinesTestRule.testDispatcher.runBlockingTest {
    coEvery { db.withTransaction(captureCoroutine<suspend () -> Unit>()) } answers {
        coroutine<suspend () -> Unit>().coInvoke()
    }
}

如果我做错了什么或者这是不可能的,有什么提示或技巧吗?

unit-testing lambda kotlin-coroutines suspend mockk
2个回答
1
投票

我相信你需要使用

coAnswers
:

@Test
fun test() = coroutinesTestRule.testDispatcher.runBlockingTest {
    coEvery { 
       db.withTransaction(captureCoroutine<suspend () -> Unit>())
    } coAnswers {
       coroutine<suspend () -> Unit>().coInvoke()
    }
}

0
投票

我发现唯一有效的是添加此功能:

@Before
fun setup() {
    mockkStatic("androidx.room.RoomDatabaseKt")
    coEvery { mockDatabase.withTransaction(captureCoroutine<suspend () -> Unit>()) } coAnswers {
        coroutine<suspend () -> Unit>().captured.invoke()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.