Android - модульный тест, чтобы проверить, было ли нажатие кнопки успешным

Я работаю над приложением и хочу проверить, изменил ли успешный вход в систему, нажав кнопку входа, значение входа в мое приложение, но я продолжаю получать:

CalledFromWrongThreadException

Редактировать: добавил трассировку стека. Я использую Android Studio 3.1.3 и запускаю тесты на виртуальном устройстве (Nexus S Lollipop).

Код:

@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:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)
at android.view.View.invalidateInternal(View.java:11801)
at android.view.View.invalidate(View.java:11737)
at android.widget.TextView.invalidateRegion(TextView.java:4895)
at android.widget.TextView.invalidateCursor(TextView.java:4838)
at android.widget.TextView.spanChange(TextView.java:7774)
at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:9499)
at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:981)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:690)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:607)
at android.text.Selection.setSelection(Selection.java:76)
at android.text.Selection.setSelection(Selection.java:87)
at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:318)
at android.widget.TextView.setText(TextView.java:4045)
at android.widget.TextView.setText(TextView.java:3915)
at android.widget.EditText.setText(EditText.java:85)
at android.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 android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at android.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 android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)

Не могли бы вы включить всю трассировку стека, а не только сообщение об ошибке.

EJK 22.07.2018 04:04

Также вам нужно указать, какой тестовый раннер вы используете. Это Robolectirc? Это инструментальный тест Android? Или это просто ванильный джунит?

EJK 22.07.2018 04:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
4 415
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы используете ActivityTestRule, я предполагаю, что вы используете эспрессо. Если вы используете Espresso, вы должны использовать API Espresso для взаимодействия с представлениями вместо поиска представления и вызова performClick (). Обновите свой тест примерно так:

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

Другие вопросы по теме