[英]Espresso / Mockito verify that method was called
我有一個使用activityTestRule
進行的簡單測試,該測試應檢查被測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();
}
編輯:
我注意到創建間諜返回null的原因是未知的:
MapSettingsActivity spy = spy(activityRule.getActivity());
首先,這並不是您問題的確切解決方案,但也許可以為您提供幫助。
所以這就是我處理類似問題的方式。 通常:為了使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包含真實活動的實例,因此您需要某種方式將其替換為間諜對象。 我不確定該怎么做,但是我想有機會創建此規則的子類並可能在構造函數中創建活動的間諜。 然后,您將獲得間諜對象並使用它來驗證所有調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.