[英]How to mock a custom ImageView for activity unit testing
我有一個LoginActivity
,它在onResume()
加載了SplashFragment
。
初始片段的布局XML包含一個名為RotatingImageView
的自定義ImageView
,顧名思義,該ImageView
在將源圖像附加到Window后即開始旋轉。
現在,當我嘗試使用ActivityInstrumentationTestCase2<LoginActivity>
編寫LoginActivity
的單元測試時,這會引起問題。 我正在嘗試在真實設備(無根)而非模擬器上運行測試。
getActivity()
調用開始活動,但是由於旋轉的圖像視圖(動畫是順便說一句),濃縮咖啡被卡住了。 我知道意式濃縮咖啡不喜歡在那里播放動畫。 我有例外
“濃縮咖啡無法在45秒內啟動意圖。也許主線程在合理的時間內沒有空閑?可能存在動畫或不斷在重新繪制屏幕的東西。或者活動正在創建時進行網絡調用?請參閱作為參考,事件隊列在活動啟動請求之前的最后一次空閑時間為1487296262885,現在隊列的最后空閑時間為:1487296262885。如果這些數字相同,則您的活動可能會占用事件隊列。 ..”
現在顯然問題是要以某種方式停止/模擬動畫。
我已經從設備->設置->開發人員選項中禁用了所有動畫選項,但是仍然在啟動活動時看到圖像旋轉,所以這無濟於事。
我也研究了禁用動畫以進行Espresso測試,但這也沒有太大幫助。 我本來可能做錯了,但無論如何,這沒有幫助。
另一個選擇是使用特殊意圖啟動LoginActivity
,該意圖告訴活動它正在測試中啟動,因此當您加載片段時,它將禁用動畫。 該方法有效,但是並不理想,因為它涉及在主類中添加純粹用於測試的代碼。
另一種解決方案是模擬RotatingImageView
,然后在開始加載之前將其注入SplashFragment
。 我本來可以嘲笑對startSpinningAnimation
的調用,所以當它加載到Window中時將不會啟動動畫。
我的問題是:可能嗎? 在完成對getActivity()
的調用之前,是否可以以某種方式將此自定義imageView
模擬並注入到片段中?
是的,有可能,您可以創建一個名為AnimationUtil
的類,將您的動畫方法放入該類中,並在測試過程中對其進行模擬。
public Animation getWhateverAnimation(int duration){
RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(duration);
return anim;
}
並在您的androidTest
包(不是main
包)中創建一個extend
AnimationUtil
的MockAnimationUtil
,並重寫和方法。
public Animation getWhateverAnimation(int duration){
return super.getWhateverAnimation(0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.