2

我正在寫濃縮咖啡測試。下面是測試案例無法在45秒內啓動意圖。也許主線程在合理的時間內沒有閒置?

晶圓廠的OnClick,啓動應用QuizActivity。

讓我向你解釋一點關於我的應用程序。

所以應用程序的要求是 -

  1. 有資產的文件夾JSON文件
  2. 我必須分析它,並把數據存儲在數據庫
  3. 在主要活動從數據庫中加載這些數據轉化爲recyclerview 。還有的Fab按鈕,在點擊它的應用程序傳遞數據的隨機列表(這是我在recyclerview已加載)到QuizActivity

這是我如何做編碼 -

  1. 在MainActivity的onCreate()使用AsyncTask解析數據並將數據插入數據庫一次。
  2. 一旦數據可用,通過AsyncTaskLoader將其加載到recyclerview中
  3. 在Fab上設置Onclick監聽器。並將所需數據傳遞給QuizActivity。

下面是我的測試

@RunWith(AndroidJUnit4.class) 
public class ExampleInstrumentedTest { 
    /* @Rule 
    public IntentsTestRule<MainActivity> intentsTestRule = 
      new IntentsTestRule<MainActivity>(MainActivity.class); 
*/ 

    @Rule 
    public ActivityTestRule<MainActivity> intentsTestRule = 
      new ActivityTestRule<MainActivity>(MainActivity.class,false,true); 

    @Test 
    public void fabTest(){ 
     onView(withId(R.id.fab)).perform(click()); 
     //Check if the text_question textview is displayed 
     onView(withId(R.id.text_question)).check(matches(isDisplayed())); 
    } 

    /* @Test 
    public void clickFloatingActionButton() { 
     onView(withId(R.id.fab)) 
       .perform(click()); 
     intended(hasComponent(new ComponentName(getTargetContext(), QuizActivity.class))); 
    }*/ 
} 

我的辦法是 -

  1. 查找的Fab
  2. 執行單擊
  3. 檢查顯示text_question TextView的。注意這個textview是在QuizActivity上。

後,我跑我得到了測試

了java.lang.RuntimeException:無法啓動意圖意圖{ 行爲= android.intent.action.MAIN FLG = 0x14000000 CMP = my_package_name/.MainActivity}在45秒內。主線程可能在合理的時間內沒有閒置? 有可能是一個動畫或不斷重新繪製 屏幕。或者該活動正在創建網絡電話?請參閱 線程轉儲日誌。爲了便於參考,最後一次事件隊列爲 ,在您的活動啓動請求爲1505287862579並且現在爲 上次隊列空閒時爲空閒:1505287862579.如果這些數字是 ,則您的活動可能佔用事件隊列。

PS - 我已經關閉了所有的動畫。代碼中沒有進度條。

而且更一個音符,如果我註釋掉的AsyncTask,AsyncTaskLoader中的onCreate RecyclerView部分()方法,那麼測試在流逝。

我懷疑它可能是由於後臺任務造成的。

任何人都面臨類似的問題?如果您知道解決方案,請告訴我。我掙扎了兩天。我在stackoverflow上搜索類似的線程,但沒有爲我工作。

回答

3

我終於得到了解決方案!

其實,罪魁禍首是我的適配器中的自定義視圖。

咖啡等到AsyncTaskAsyncTaskLoader加載數據,但它看起來像自定義視圖作爲例外規定導致此問題:

主線程的一段合理的時間內一直沒有去閒? 有可能是一個動畫或不斷重新繪製 屏幕。

不管怎麼說爲了克服這個問題,我需要做的是 -

「如果在測試運行設置自定義視圖的知名度水漲船高」

,你會怎麼做?

private AtomicBoolean isTestRunning; 

    public synchronized boolean isTestRunning() { 
     if (null == isTestRunning) { 
      boolean istest; 

      try { 

       Class.forName ("Full path of your TestName"); // for e.g. com.example.MyTest 

       istest = true; 
      } catch (ClassNotFoundException e) { 
       istest = false; 
      } 

      isTestRunning = new AtomicBoolean (istest); 
     } 

     return isRunningTest.get(); 
    } 

現在,這裏我使用Recyclerview所以在ViewHolder

public InsectHolder(View itemView) 
     { 
      super(itemView); 
         customView = (DangerLevelView) itemView.findViewById(R.id.danger_level_tv); 

      if(isRunningTest()) { 
       customView.setVisibility(View.GONE); 
      } 
     } 

而且耶!你的測試會通過。

希望有人認爲它有幫助!

如果您在下面的評論部分有任何問題,請讓我知道!

相關問題