我有一个集成测试,在测试中,我将一个监视的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
2条答案
按热度按时间inkz8wg91#
答案是,这个行为已经被其他用户确认了,现在正作为一个bug被MockK项目跟踪:https://github.com/mockk/mockk/issues/554
blmhpbnm2#
我建议使用
UnconfinedTestDispatcher()
。这对我来说效果非常好。