Mockito: проверка на метод Mocked не работает - PullRequest
0 голосов
/ 04 декабря 2018

Я столкнулся со странным поведением с 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 говорит, что взаимодействие с макетом не происходит.

Что я делаю не так?Я думаю, что не могу смутить ответ метода макета и проверить вызов метода на том же самом макете, но я не могу понять, правда ли это, и / или найти решение.

1 Ответ

0 голосов
/ 05 декабря 2018

Похоже, что тест завершался до фонового выполнения, поэтому не захватывал взаимодействия.принудительное выполнение этих методов в основном потоке во время тестов решило проблему

...