android 使用spyk和coVerify进行验证时出现奇怪的失败消息(额外参数)

3b6akqbq  于 2023-03-11  发布在  Android
关注(0)|答案(2)|浏览(142)

我有一个集成测试,在测试中,我将一个监视的Retrofit传递到我的存储库:

val apiSpy = spyk(PvApiService.getInstance())
val expectedTokenLength = 1290 // by definition

test("Token can be refreshed") {
    val repo = Repository(apiSpy)
    repo.reset()
    repo.refreshToken() // Suspends, run on IO thread
    coVerify (exactly = 1){apiSpy.tokenRetrofitService.getApiToken(any(), any()) }
    repo.tokenAvailable shouldBe true
    repo.token.length shouldBe expectedTokenLength
}

这将导致在spy上的验证失败,并显示以下消息(请注意,其他测试已通过,这意味着调用已实际执行!):

Verification failed: call 2 of 2: PvApiTokenService(child of #2#3).getApiToken(any(), any(), any())) was not called
java.lang.AssertionError: Verification failed: call 2 of 2: PvApiTokenService(child of #2#3).getApiToken(any(), any(), any())) was not called

我使用mock而不是spy对存储库进行相应的单元测试,其行为与预期一致:

val mockApi = mockk<PvApiService>(relaxed = true)
val testToken = "a token"

test("Token can be refreshed") {
    coEvery { mockApi.tokenRetrofitService.getApiToken(any(), any()) } returns testToken
    val repo =  Repository(mockApi, ProjectConfig.testDispatcherProvider)
    repo.refreshToken()
    coVerify (exactly = 1){ mockApi.tokenRetrofitService.getApiToken(any(), any()) }
    repo.token shouldBe testToken
    repo.tokenAvailable shouldBe true
}

我不明白spy使用失败的原因,我验证的是getApiToken(any(), any())(即any()两次),失败信息是getApiToken(any(), any(), any()))(即any() * 三 * 次)。
我做了什么,让MockK尝试用一个额外的参数来验证对间谍的调用?
编辑:我现在已经在MockK问题跟踪器中添加了一个问题,以尝试理解这种行为!https://github.com/mockk/mockk/issues/554

inkz8wg9

inkz8wg91#

答案是,这个行为已经被其他用户确认了,现在正作为一个bug被MockK项目跟踪:https://github.com/mockk/mockk/issues/554

blmhpbnm

blmhpbnm2#

我建议使用UnconfinedTestDispatcher()。这对我来说效果非常好。

相关问题