代码之家  ›  专栏  ›  技术社区  ›  Daniel Wilson

对LiveData postValue执行Mockito verify()失败

  •  0
  • Daniel Wilson  · 技术社区  · 6 年前

    clickRepo 测试 here

    错误:

    Wanted but not invoked:
    navController.navigate(
    app.ui.login.LoginFragmentDirections$ShowSelectMerchant@377f3c27
    );
    

    LoginFragmentTest.kt

    @Test
    fun success(){
        val user = TestUtil.createUser(email)
    
        userData.postValue(Resource.success(user))
    
        System.out.println("Test NavController Hash: " + testFragment.navController.hashCode())
                verify(testFragment.navController).navigate(LoginFragmentDirections.showSelectMerchant().matcher())
    
    }
    

    override fun openSelectMerchantFragment() {
        System.out.println("Real NavController Hash: " + navController().hashCode())
        navController().navigate(LoginFragmentDirections.showSelectMerchant())
    }
    

    openSelectMerchantFragment 在将成功的资源发布到live userData时调用。考试不及格有明显的原因吗?

    我可以看到测试片段的mock nav controller和片段中被调用的nav controller具有相同的hash值,因此我非常确定我如何模拟activity、fragment或nav controller没有问题。我还可以很明显地看到,navigate()函数确实被调用了。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Wilson    6 年前

    这里的问题是一个简单的测试LiveData的问题。仅仅增加一个 TaskExecutorWithIdlingResourceRule ,但是 drainTasks() 必须调用才能完成数据过帐。我无法回答为什么它在没有调用 drainTasks ,我最好的猜测是,这些测试中的发布完成得足够快,因此不会成为一个问题。我 认为 排水管 当实时数据发布到时。

    @Test
    fun success(){
        val user = TestUtil.createUser(email)
    
        userData.postValue(Resource.success(user))
        executorRule.drainTasks(1, TimeUnit.SECONDS)
    
        verify(testFragment.navController).navigate(LoginFragmentDirections.showSelectMerchant().matcher())
    }