2011-08-05 43 views
5

我是Android測試人員的新手。我想測試點擊一個按鈕是否會打開相應的活動。我做了一些研究,發現我需要使用ActivityManager進行檢查。如何在Android JUnit測試用例中調用Button.performClick?

問題是,我不能得到的「咔嗒」的一部分工作。我正在嘗試使用Button.performClick()

起初我只是調用此函數,並得到一個錯誤說我不能在當前線程做到這一點。一些谷歌搜索後,我發現我需要在UI線程中調用它,並遇到runOnUiThread(Runnable r) method

我試圖點擊該按鈕_helloButton_。這在_setUp()_ method中獲得。我做了_assertNotNull_檢查,以確保它在那裏。

內的測試方法,我稱之爲

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.requestFocus(); 
     } 
    }); 
helloButton.performClick(); 

,我在排隊叫requestFocus()獲得NPE。

下一個我試圖

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.performClick(); 
     } 
    }); 

,並仍然得到同樣的空指針異常。

在JUnit的角度來看,我得到這個消息

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details 

而且堆棧跟蹤這個樣子。 57

08-05 19:03:11.922: ERROR/AndroidRuntime(578): Uncaught handler: thread main exiting due to uncaught exception 
08-05 19:03:11.922: ERROR/AndroidRuntime(578): java.lang.NullPointerException 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.example.helloworldmk2.test.HelloWorldMK2Test$1.run(HelloWorldMK2Test.java:57) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.handleCallback(Handler.java:587) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Looper.loop(Looper.java:123) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at dalvik.system.NativeStart.main(Native Method) 

行是我打電話helloButton.performClick()

我不知道爲什麼我得到NPE; assertNotNull通過沒有問題。如果你能幫我解決這個問題,我會很感激。提前致謝。

編輯:我繼承ActivityInstrumentationTestCase2這個特定的測試類。

EDIT2:logcat的噴出了一些錯誤,NPE發生之前。

我看到

08-05 20:08:54.702:ERROR/AndroidRuntime(754):錯誤:線程附加失敗

08-05 20:08:58.642:ERROR/gralloc(52):[註銷]處理0x3e1b28仍處於鎖定狀態(狀態= 40000001)

+0

爲了澄清,你要按下一個按鈕,將觸發推出新的活動的方法是什麼? –

+0

是的。該按鈕有一個onClickListener,它啓動另一個活動。 –

回答

15

您可以標註您的測試對UI線程上運行:

@UiThreadTest 
public void testNoErrorInCapitalization() { 
    final String msg = "this is a sample"; 
    mMessage.setText(msg); 
    mCapitalize.performClick(); 
    final String actual = mMessage.getText().toString(); 
    final String notExpectedRegexp = "(?i:ERROR)"; 
    assertNotContainsRegex("Capitalization found error:", 
     notExpectedRegexp, actual); 
} 

這是取自Android Application Testing Guide的示例。

+0

你剛剛救了我的一天先生。謝謝! –

-1

您正在服用過於困難的辦法,以一個簡單的問題...本質上,你需要構建這樣代碼當心,這是須藤代碼,不會工作

public void myOnClickListener(View source) { 

    switch source.getId() { 
    case R.id.Your_Button_Name_In_Xml : 
    Intent MyNewActivity = new Intent(this, MyNewClass.class); 
    startActivity(MyNewActivity); 
    } 
} 

檢查了這一點http://learnandroid.blogspot.com/2008/01/opening-new-screen-in-android.html

+0

我知道這種方法是如何工作的,但這並不是我在這裏需要做的。這是一個JUnit測試用例;所有按鈕點擊偵聽器都已定義。我只需要能夠在測試用例方法中單擊它即可。 –

0

您還可以使用runTestOnUiThread()像下面

public void testHelloButton() throws Throwable{ 
     runTestOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       helloButton.performClick(); 
      } 
     }); 

    }