【发布时间】:2018-12-04 13:11:22
【问题描述】:
我在使用 Mockito 时遇到了一种奇怪的行为。
测试初始化:
private val dao = Mockito.mock(AdDetailsDao::class.java)
private val offeredResponse = Mockito.mock(AdDetailsRestResponse::class.java) as AdDetailsRestResponse<AdOffered>
本次测试成功完成:
@Test
fun shouldCallWantedAdDetailsAndNotOfferedAdDetails_whenIsNotOfferedAndNotFallback(){
val handler = AdDetailsHandler(dao, false, false, CompositeDisposable())
handler.loadAd("some_id")
verify(dao).getWantedAdDetails(anyString())
verify(dao, times(0)).getOfferedAdDetails(anyString())
}
这个不是:
@Test
fun shouldCallOfferedAdDetailsAndWantedAdDetails_whenIsOfferedAndFallbackAndOfferedAdNotExist(){
val handler = AdDetailsHandler(dao, true, true, CompositeDisposable())
doReturn(false).`when`(offeredResponse).success
doReturn(offeredResponse).`when`(dao).getOfferedAdDetails(anyString())
handler.loadAd("some_id")
verify(dao).getWantedAdDetails(anyString())
}
正在测试的方法(注意此方法由调度程序在后台执行):
private fun loadWantedTask(id: String): AdDetailsResponse {
return trackTaskDuration(AnalyticsTagsFabric.Event.AD_DETAILS_LOADED) {
val response = adDetailsDao.getWantedAdDetails(id)
AdDetailsWantedResponse(response.advert)
}
}
private fun loadOfferedWithFallbackTask(id: String): AdDetailsResponse {
return trackTaskDuration(AnalyticsTagsFabric.Event.AD_DETAILS_LOADED) {
System.out.println("task")
val response = adDetailsDao.getOfferedAdDetails(id)
System.out.println("success:" + response.success+ " obj id:"+response)
if (response.success) {
System.out.println("in offered")
AdDetailsOfferedResponse(response.advert)
}
else {
System.out.println("offered else")
val response = adDetailsDao.getWantedAdDetails(id)
System.out.println("success:" + response.success+ " obj id:"+response)
if (response.success) {
System.out.println("in wanted")
AdDetailsWantedResponse(response.advert)
} else {
System.out.println("in error")
AdDetailsErrorResponse(Exception())
}
}
}
测试第二种方法时的输出是:
task
success:false obj id:Mock for AdDetailsRestResponse, hashCode: 991806841
offered else
您可以清楚地看到它明确调用了 getWantedAdDetails(),但 mockito 说没有与 mock 交互。
我做错了什么?我认为我无法模拟模拟方法的响应并验证同一模拟上的方法调用,但我无法确定这是否属实和/或找到解决方案。
【问题讨论】:
标签: android unit-testing mockito tdd