首页 > 解决方案 > MockK协程响应无法响应

问题描述

试图更深入地使用MockK涉及协程的地方。我有这个测试:

class UserDataUseCaseTest {

    @MockK
    val dataFetcherService: DataFetcherService = mockk()

    @MockK
    val userData: UserData = mockk()

    @ExperimentalCoroutinesApi
    @Test
    fun `fetching salt populates user data salt value`() = runBlockingTest {
        MockKAnnotations.init(this)
        val userDataUseCase = UserDataUseCase(mockk(), mockk(), mockk())
        every { userData.user_name } returns FAKE_USER
        coEvery { dataFetcherService.getSaltForUser(FAKE_USER) } returns SALT_RESPONSE
        userDataUseCase.getSaltForUser(userData)
        assertEquals(SALT, userData.salt)
    }

    companion object {
        private const val FAKE_USER = "fake_user"
        private const val SALT = "salt"
        private val SALT_RESPONSE = SaltResponse(
            result = "",
            title = "",
            message = "",
            salt = SALT,
            auth_code = "auth_code",
            userMustChangePassword = false
        )
    }
}

这失败并出现以下错误:

io.mockk.MockKException:找不到答案:DataFetcherService(#4).getSaltForUser(fake_user, continuation {})

我尝试测试的方法如下所示:

@VisibleForTesting
suspend fun getSaltForUser(userData: UserData) {
    val saltResponse = dataFetcherService.getSaltForUser(userData.user_name)

    with (userData) {

        salt = if (saltResponse.salt.isEmpty())
            KeyChainWrapper().generateRandomString(KeyChainWrapper.SALT_LEN)
        else saltResponse.salt

        authCode = saltResponse.auth_code
        userMustChangePassword = saltResponse.userMustChangePassword
    }
}

为什么我没有getSaltForUser()接到电话?谢谢你的帮助。

标签: androidunit-testingmockk

解决方案


从该示例代码的外观来看,被测类没有使用与测试中定义的模拟相同的模拟:

val userDataUseCase = UserDataUseCase(mockk(), mockk(), mockk())

应该是这样的

val userDataUseCase = UserDataUseCase(dataFetcherService, mockk(), mockk())

取决于DataFetcherService应该是哪个参数


推荐阅读