我使用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());
答案 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包含实际活动的实例,因此您需要以某种方式将其替换为间谍对象。我不知道该怎么做,但我想有机会创建这个规则的子类,并在构造函数中创建活动的间谍。然后你会得到间谍对象并用它来验证任何电话。