我和莫基托有一种奇怪的行为。
测试初始化:
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交互。
我做错什么了?我认为我不能模拟mock方法的响应并在同一个mock上验证一个方法调用,但是我不能弄清楚这是否是真的和/或找到一个解决方案。