2010-06-15 38 views
3

目前我正在試圖活性測試教程(Found here),和有問題。看來,每當我嘗試調用UIThread內部的東西時,我都會得到java.lang.NullPointerException。NullPointerException異常的活性測試教程

public void testSpinnerUI() { 
    mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      mSpinner.requestFocus(); 
     } 
    }); 
} 

這給了我:

未完成:顯示java.lang.NullPointerException

,別無其他。我現在已經在兩個不同的樣品上嘗試過了,結果相同。我在mSpinner.requestFocus()調用周圍嘗試了一個try/catch子句,似乎mSpinner在該線程內爲null。我用相同示例中的setUp()函數正確設置了它,並且快速assertNotNull(mSpinner)顯示mSpinner實際上在setUp()函數後不爲null。這可能是什麼原因?

EDIT;好的,還有一些測試已經完成。似乎正在測試的應用程序在每次測試之間重置。這基本上使我必須重新實例化每個測試之間的所有變量。這是正常的嗎?

回答

6

好了,看來我現在的工作。至少到某一點。我仍然無法在runOnUiThread()內運行任何東西,但是我發現使用@UiThreadTest註解給了我滿意的結果。我不再得到NullPointerExceptions,並且setUp()方法甚至可以正確運行。我不知道是什麼造成了這一點,但是,嘿,至少它是工作:)

1

不要問我爲什麼,但如果添加至少一個sendKey()到你的代碼它的工作原理:

public void testSoundSpinnerUI() { 
    myActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      mySoundSpinner.requestFocus(); 
      mySoundSpinner.setSelection(0); 
     } 
    }); 

    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); 
    sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); 
    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); 
} 
+1

我知道sendKeys方法有幫助,因爲它等待UIThread準備就緒。 – Johnus 2011-01-25 04:08:46

1

我有同樣的問題以及其他一些奇怪的空指針異常。奇怪的是,這似乎與在測試類中使用靜態成員變量有關。

只要我刪除從變量的static關鍵字,那麼所有的問題都解決了。它沒有任何意義,因爲變量與首先導致異常的代碼行無關。

但所有的作品現在...

0

此異常主要是由當你的活動啓動時引發另一個異常引起的。因爲它沒有創建活動,所以你得到NullPointException。嘗試通過在第一次調用getActivity()並在代碼中查找錯誤的位置設置斷點來調試您的測試。

3

我遇到了同樣的問題。使用runOnUiThread()的測試在我的測試類的成員字段上定期失敗。在調試器中,當UI線程執行代碼時,我可以看到它們爲空。

據我所知,runOnUiThread只是職位,將在以後獲得分派的事件。不幸的是,這通常會在測試的其餘部分在主線程中完成並且我的對象被破壞之後發生。這可能是因爲模擬器太忙而無法在測試繼續之前處理UIEvent。

我能夠用的CyclicBarrier,以確保我的測試沒有繼續代碼在UiThread已運行後,直到來解決這個問題。我創建了一個方法來封裝它並使用它來代替Activity。runOnUiThread()在我的測試:

private void myRunOnUiThread(final Runnable r) { 
    final CyclicBarrier barrier = new CyclicBarrier(2); 
    mActivity.runOnUiThread(
     new Runnable() { 
     public void run() { 
      r.run(); 
      try { barrier.await(); } catch (Exception e) { e.printStackTrace(); } 
    }}); 
    try { barrier.await(); } catch (Exception e) { e.printStackTrace(); } 
    } 

這是它的外觀在我的測試類:

public void testFieldUI() { 
     myRunOnUiThread(
       new Runnable() { 
        public void run() { 
         mRateView.requestFocus(); 
         mRateView.selectAll(); 
        } 
       } 
     ); 
     sendKeys(KeyEvent.KEYCODE_DEL); // delete everything 
     assertTrue("rate is deleted", mRateView.getText().length() == 0); 
+0

謝謝!我一直在想,爲什麼我的測試可以在@UiThreadTest中運行,但不能在runOnUiThread()中運行幾天。 – Godsmith 2013-09-15 16:47:32

1

我有同樣的問題,並作爲德魯提出的問題是,測試類完成,在UI線程完成之前銷燬我的成員變量。這導致UI線程中的空指針異常。

我的修復程序是我創建了boolean running變量,它告訴UI線程是否仍在運行。如果UI線程仍在運行,當'main'線程完成時,我正在檢查running變量是否爲真。如果是這樣,我會再次嘗試前睡200毫秒。而在UI線程中,最後一件事是我將runnable設置爲false,並且主線程也存在。

public void testSomething() { 
    activity.runOnUiThread(
      new Runnable() { 
       public void run() { 
        // Run something on UI-thread 

        // In the end of this thread, set stillRunning false 
        stillRunning = false; 
       } 
      }); 

    while(stillRunning) { 
     try { 
      Thread.sleep(200); 
     } catch (InterruptedException e) { 
      // Handle exception 
     } 
    } 
} 
相關問題