【问题标题】:Espresso / Mockito verify that method was calledEspresso / Mockito 验证该方法是否被调用
【发布时间】:2017-11-02 17:22:15
【问题描述】:

我有一个使用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 的数据绑定,它会调用回调,而回调又会调用被测活动的方法。

注意:

方法是activity上的简单方法:

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

编辑:

我注意到创建间谍返回 null 的原因尚不清楚:

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

【问题讨论】:

  • setLiveLocation() 是最终方法吗?这是哪个版本的 Mockito?对于 Espresso 测试,您需要使用 mockito android
  • @DavidRawson 这不是最终方法,它是 mockito 版本 2.+。抱歉回复晚了。
  • 您介意发布您的build.gradleandroidTestCompile 部分吗?

标签: android mockito android-espresso


【解决方案1】:

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

这就是我处理类似问题的方式。一般来说:为了让 Mockito 能够检测到对 spy 对象的方法调用,必须在 spy 对象上调用这个方法(如果你明白我在说什么,因为我不明白))。在你的情况下这不是真的。您的 setLiveLocation 调用了活动的真实实例,该实例存储在 ActivityTestRule 中。

我的例子: 我需要验证 RecyclerView 的适配器 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 包含真实活动的实例,因此您需要以某种方式将其替换为间谍对象。我不知道该怎么做,但我想有机会创建这个规则的子类,并可能在构造函数中创建活动间谍。然后您将获得间谍对象并使用它来验证任何调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多