簡體   English   中英

如何模擬自定義ImageView進行活動單元測試

[英]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。如果這些數字相同,則您的活動可能會占用事件隊列。 ..”

現在顯然問題是要以某種方式停止/模擬動畫。

  1. 我已經從設備->設置->開發人員選項中禁用了所有動畫選項,但是仍然在啟動活動時看到圖像旋轉,所以這無濟於事。

  2. 我也研究了禁用動畫以進行Espresso測試,但這也沒有太大幫助。 我本來可能做錯了,但無論如何,這沒有幫助。

  3. 另一個選擇是使用特殊意圖啟動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 AnimationUtilMockAnimationUtil ,並重寫和方法。

public Animation getWhateverAnimation(int duration){
    return super.getWhateverAnimation(0);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM