代码之家  ›  专栏  ›  技术社区  ›  jack_the_beast

Mockito:验证一个没有工作的模拟方法

  •  0
  • jack_the_beast  · 技术社区  · 6 年前

    我和莫基托有一种奇怪的行为。

    测试初始化:

    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上验证一个方法调用,但是我不能弄清楚这是否是真的和/或找到一个解决方案。

    1 回复  |  直到 6 年前
        1
  •  0
  •   jack_the_beast    6 年前

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