0

我有一個LoginActivity,它在onResume()中加載了一個SplashFragment如何模擬自定義ImageView進行活動單元測試

飛濺片段的佈局XML包含一個名爲RotatingImageView的自定義ImageView,顧名思義,它一開始將源圖像連接到窗口就開始旋轉。

現在,當我嘗試使用ActivityInstrumentationTestCase2<LoginActivity>編寫LoginActivity的單元測試時,會出現問題。我試圖在真實設備上運行測試(無根),而不是仿真器。

getActivity()調用啓動活動,但由於旋轉圖像視圖(這是一個動畫順便說一句),咖啡卡住了。我知道濃縮咖啡不喜歡那裏的動畫。我得到的例外

「咖啡不能在45秒內啓動的意圖。也許在合理的時間量內的主要 線程一直沒有去閒?有 可能是一個動畫或東西不斷地重繪屏幕。 或者該活動正在進行創建時的網絡調用?請參閱線程轉儲 日誌。爲便於參考,上次事件隊列在 之前處於空閒狀態,則您的活動啓動請求爲1487296262885,現在最後一次爲 隊列已空閒爲:1487296262885如果這些號碼相同 您的活動可能會佔用事件隊列......「

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

  1. 我已經禁用的設備全部動畫選項 - >設置 - >開發人員選項,但仍活動時我看到的圖像旋轉啓動所以這並不能幫助。

  2. 我也研究過Disable animations for Espresso tests但這對我也沒有太大的幫助。無論如何,我本來可以做錯,但這並沒有幫助。

  3. 另一種選擇是使用特殊意圖啓動LoginActivity,該意圖告訴活動它正在測試中啓動,因此當您加載片段時會禁用動畫。這種方法可行,但並不理想,因爲它涉及在純粹用於測試的主類中添加代碼。其他

一種解決方案可能是嘲笑RotatingImageView它它開始加載之前注入SplashFragment。我會嘲笑startSpinningAnimation的調用,所以當它加載到窗口中時,它不會啓動動畫。

我的問題是:這可能嗎?我可以在打電話給getActivity()之前以某種方式模擬並將此自定義imageView注入到我的片段中嗎?

回答

1

是的,您可以創建一個名爲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; 
} 

,並創建一個MockAnimationUtilextendAnimationUtilandroidTest組(沒有main包),並覆蓋和方法。

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

謝謝。這工作。我將動畫邏輯從「CustomImageView」中分離出來。該片段將從「MyApplication」中獲得此實例。在測試中,我可以在啓動測試活動之前在'MyApplication'實例中注入一個模擬實例。作品! – kdas

相關問題