有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android单元测试,检查按钮点击是否成功

我正在开发一个应用程序,想通过点击登录按钮来测试成功登录是否改变了我的应用程序的loggedin值,但我一直得到:

CalledFromWrongThreadException

编辑:添加了stacktrace。我正在使用Android Studio 3.1.3,并在虚拟设备(Nexus S棒棒糖)上运行测试

代码:

@Rule
public ActivityTestRule<LoginActivity> loginActivityActivityTestRule =  
    new ActivityTestRule<LoginActivity>(LoginActivity.class);
private LoginActivity loginActivity = null;

@Before
public void setUp() throws Exception {
    loginActivity = loginActivityActivityTestRule.getActivity();
}

@Test
public void checkLoginButton() throws Throwable {
    final Button login = loginActivity.findViewById(R.id.login);

    loginActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            login.performClick();
        }
    });

    assertTrue(loginActivity.sc.loggedin);
}

@After
public void tearDown() throws Exception {
    loginActivity = null;
}

Stacktrace:

安卓.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at 安卓.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
at 安卓.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)
at 安卓.view.ViewGroup.invalidateChild(ViewGroup.java:4690)
at 安卓.view.View.invalidateInternal(View.java:11801)
at 安卓.view.View.invalidate(View.java:11737)
at 安卓.widget.TextView.invalidateRegion(TextView.java:4895)
at 安卓.widget.TextView.invalidateCursor(TextView.java:4838)
at 安卓.widget.TextView.spanChange(TextView.java:7774)
at 安卓.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:9499)
at 安卓.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:981)
at 安卓.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:690)
at 安卓.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:607)
at 安卓.text.Selection.setSelection(Selection.java:76)
at 安卓.text.Selection.setSelection(Selection.java:87)
at 安卓.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:318)
at 安卓.widget.TextView.setText(TextView.java:4045)
at 安卓.widget.TextView.setText(TextView.java:3915)
at 安卓.widget.EditText.setText(EditText.java:85)
at 安卓.widget.TextView.setText(TextView.java:3890)
at swp.app.LoginActivityTest.checkLoginButton(LoginActivityTest.java:61)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at 安卓.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at 安卓.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at 安卓.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:527)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at 安卓.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at 安卓.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
at 安卓.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)

共 (1) 个答案

  1. # 1 楼答案

    既然你用的是ActivityTestRule,我猜你用的是浓缩咖啡。如果您使用的是Espresso,那么应该使用Espresso API与视图交互,而不是查找视图并调用performClick()。将测试更新为以下内容:

    @Test
    public void checkLoginButton() throws Throwable {
        onViewWithId(R.id.login).perform(click());
        assertTrue(loginActivity.sc.loggedin);
    }