如何在Android JUnit测试用例中调用Button.performClick?

时间:2011-08-05 19:41:13

标签: android unit-testing

我是Android测试新手。我想测试点击按钮是否会打开相应的活动。我做了一些研究,发现我需要使用ActivityManager来进行检查。

问题是,我无法让“点击”部分工作。我正在尝试使用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

stackTrace看起来像这样。

    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)

第57行是我呼叫helloButton.performClick()的地方。

我不知道为什么我会得到NPE; assertNotNull没有问题。如果你可以帮我解决这个问题,我真的很感激。提前谢谢。

编辑:我正在为这个特定的测试类继承ActivityInstrumentationTestCase2。

EDIT2:Logcat在NPE发生之前发出一些错误。

我看到了

08-05 20:08:54.702:ERROR / AndroidRuntime(754):ERROR:线程附着失败

08-05 20:08:58.642:ERROR / gralloc(52):[取消注册]句柄0x3e1b28仍然被锁定(状态= 40000001)

3 个答案:

答案 0 :(得分: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的例子。

答案 1 :(得分:0)

您也可以使用如下所示的runTestOnUiThread()方法

public class Note
{
    [Key] 
    public int NoteId { get; set; }

    [Required]
    public string Content { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

答案 2 :(得分:-1)

你对一个简单的问题采取了一个非常困难的方法......基本上你需要像 BEWARE这样构造的代码,这是伪代码并且不起作用

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