我是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)
答案 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