【问题标题】:Mockito: verify on a Mocked method not workingMockito:验证 Mocked 方法不起作用
【发布时间】: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


    【解决方案1】:

    所以看起来测试在后台执行之前完成,因此没有捕获交互。仅在测试期间强制这些方法在主线程上运行解决了问题

    【讨论】:

      猜你喜欢
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多