Espresso / Mockito验证该方法被调用

时间:2017-11-02 17:22:15

标签: android mockito android-espresso

我使用activityTestRule进行了简单测试,该测试应该检查是否调用了被测活动的方法:

@Test
public void callLiveLocation() {
    MapSettingsActivity spy = spy(activityRule.getActivity());
    doNothing().when(spy).setLiveLocation();
    onView(withId(R.id.btn_map_current_location)).perform(click());
    verify(spy).setLiveLocation();
}

我在检查调试模式时调用方法setLiveLocation() 但是,控制台告诉我:

  

想要但未被调用:mapSettingsActivity.setLiveLocation();    - >在com.android.dx.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:53)   实际上,这个模拟没有互动。

如何检查被测活动的方法是否被调用? 我使用Android的数据绑定按钮单击,它会调用一个回调,而回调又会调用被测活动的方法。

注意:

该方法是一项关于活动的简单方法:

public void setLiveLocation() {
    super.startLocationListener();
}

编辑:

我注意到,由于一个未知原因,创建spy会返回null:

MapSettingsActivity spy = spy(activityRule.getActivity());

1 个答案:

答案 0 :(得分:0)

首先,这不是您问题的确切解决方案,但也许它会对您有所帮助。

所以这就是我处理类似问题的方法。一般情况下:为了Mockito可以检测间谍对象的方法调用,必须在间谍对象上调用此方法(如果你理解我正在谈论的内容,因为我不知道))。在你的情况下并非如此。你的setLiveLocation调用真实的活动实例,它存储在ActivityTestRule中。

我的例子: 我需要验证一次只调用RecyclerView的adpter updateDataSet()方法。这就是我在Kotlin中的表现:

    val adapter = activityTestRule.activity
            .find<RecyclerView>(R.id.reviewsList)
            .adapter as FlexibleAdapter<ReviewItem>

    assertNotNull(adapter)

    val spy = spy(adapter)

    activityTestRule.activity
            .runOnUiThread {
                activityTestRule.activity
                        .find<RecyclerView>(R.id.reviewsList)
                        .adapter = spy
            }

    doNothing().`when`(spy).updateDataSet(ArgumentMatchers.any())

    onView(withId(R.id.swipeRefresh)).perform(ViewActions.swipeDown())

    verify(spy, times(1)).updateDataSet(MOCKED_REVIEWS_FROM_SERVER.map(::ReviewItem))

所以基本上我从Recycler获得适配器并将其更改为我的间谍适配器。我的测试仅在我更换时才成功完成。 在您的情况下,ActivityTestRule包含实际活动的实例,因此您需要以某种方式将其替换为间谍对象。我不知道该怎么做,但我想有机会创建这个规则的子类,并在构造函数中创建活动的间谍。然后你会得到间谍对象并用它来验证任何电话。