Эспрессо не найдет View при включении в androidTestCompile

Это чертовски странно. У меня есть Activity с ViewPager, на котором размещено несколько Fragment, у первого есть RadioButton с идентификатором android:id="@+id/backjudgeRadionButton".

У меня есть тест эспрессо, который выглядит так:

import android.test.ActivityInstrumentationTestCase2;

import model.GameSetup;
import ui.SetupActivity;
import weigl.fm.refwatch.R;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

/**
 * Created by asco on 8/7/15.
 */
public class SetupActivityEspressoTest extends ActivityInstrumentationTestCase2<SetupActivity> {


    public SetupActivityEspressoTest() {
        super(SetupActivity.class);
    }


    @Override
    protected void setUp() throws Exception {
        super.setUp();
        getActivity();
    }

    public void testUserRoleIsSet() {


        onView(withId(R.id.backjudgeRadionButton)).perform(click());

        assertEquals(GameSetup.UserRole.backjudge, getActivity().getGameSetup().getUserRole());

    }

}

Когда эспрессо импортируется в мой build.gradle через

compile('com.android.support.test.espresso:espresso-core:2.2') {
    exclude module: 'support-annotations'
}

compile('com.android.support.test:runner:0.3') {
    exclude module: 'support-annotations'
}
compile('com.android.support.test.espresso:espresso-contrib:2.2') {
    exclude module: 'support-annotations'
}

Тест работает нормально.

Когда я использую предполагаемый вариант импорта зависимостей для инструментальных тестов:

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2') {
    exclude module: 'support-annotations'
}

androidTestCompile('com.android.support.test:runner:0.3') {
    exclude module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2') {
    exclude module: 'support-annotations'
}

с androidTestCompile вместо compile тест завершается неудачей, поскольку представление с указанным идентификатором не найдено:

Running tests
Test running started
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131230756>

View Hierarchy:
+>DecorView{id=-1, visibility=VISIBLE, width=280, height=280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+->LinearLayout{id=-1, visibility=VISIBLE, width=280, height=280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+-->ViewStub{id=16909171, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+-->FrameLayout{id=16908290, res-name=content, visibility=VISIBLE, width=280, height=280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+--->LinearLayout{id=-1, visibility=VISIBLE, width=280, height=280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+---->ViewPager{id=2131558442, res-name=viewPager, visibility=VISIBLE, width=280, height=280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=true, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:82)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
at SetupActivityEspressoTest.testUserRoleIsSet(SetupActivityEspressoTest.java:30)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)

Похоже, что Espresso проверяет только представления в макете действия, а не те, которые предоставляет ViewPager.

а. Как работает мой тест при использовании compile вместо androidTestCompile?

б. Эспрессо вообще должен найти Views в Fragments внутри ViewPager?

РЕДАКТИРОВАТЬ: Это второй вариант теста эспрессо, который я пробовал, взятый из новый шаблон тестирования Android:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class SetupActivityTest {


    @Rule
    public ActivityTestRule<SetupActivity> mActivityRule =
            new ActivityTestRule<>(SetupActivity.class);

    @Test
    public void findViewPerformActionAndCheckAssertion() {
        // Find Button and Click on it
        onView(withId(R.id.backjudgeRadionButton)).perform(click());

    }

}

Он показывает тот же эффект.

Все это происходит внутри модуля wear, если это имеет значение.

EDIT2: вы можете просмотреть весь проект на GitHub.


person fweigl    schedule 07.08.2015    source источник
comment
Сначала попробуйте настроить тесты с помощью Junit: github.com/googlesamples/android-testing-templates/blob/master/. Кроме того, убедитесь, что у вас есть правильные зависимости: github.com/googlesamples/android-testing-templates/blob/master/   -  person Jared Burrows    schedule 07.08.2015
comment
@JaredBurrows Я включил упомянутые зависимости и написал свой тест по их примеру, эффект остается прежним.   -  person fweigl    schedule 10.08.2015
comment
Ах, не могли бы вы также опубликовать свой XML и код?   -  person Jared Burrows    schedule 10.08.2015
comment
@JaredBurrows Опубликовал ссылку на GitHub, спасибо за внимание.   -  person fweigl    schedule 10.08.2015
comment
Я не знал, что это RadioButtons, попробуйте: это в эспрессо"> stackoverflow.com/questions/29176585/. Кроме того, видно ли это после загрузки Activity?   -  person Jared Burrows    schedule 10.08.2015
comment
@JaredBurrows Это именно то, что я делаю (или пытаюсь сделать), нахожу представление по его идентификатору, а затем выполняю щелчок.   -  person fweigl    schedule 10.08.2015
comment
Я знаю, я говорю о том, когда вы фактически запускаете свое приложение.   -  person Jared Burrows    schedule 10.08.2015
comment
я использую тест записи эспрессо, он добавляет зависимость сам по себе, но все равно дает мне ту же ошибку. ?   -  person Kaveesh Kanwal    schedule 28.11.2016


Ответы (1)


Единственная причина, по которой я мог подумать, что это происходит, заключается в следующем: одна из зависимостей библиотеки эспрессо (мои ставки на одну из библиотек поддержки) также является зависимостью от библиотеки носимого пользовательского интерфейса (com.google.android.support:wearable ). Версия этой библиотеки зависимостей для Espresso новее, чем версия для носимых устройств. Если вы включаете Espresso в качестве «компилируемой» зависимости, используется более новая версия этой библиотеки, и все в порядке. Когда вы используете его как зависимость «androidTestCompile», более старая версия используется для создания вашего приложения.

Я бы посоветовал вам посмотреть, есть ли более поздняя версия библиотеки пользовательского интерфейса для носимых устройств (которая должна иметь последние зависимости), или выяснить, что это за зависимость, и получить последнюю версию для нее самостоятельно (и исключить ее из Espresso). и библиотека пользовательского интерфейса для носимых устройств).

person Tas Morf    schedule 10.08.2015
comment
Вау, ты попал в точку! Не могли бы вы вкратце объяснить, почему метод findView не работает, если проекты явно не добавляют последнюю версию com.android.support:support-v4:22.2.1 в качестве зависимости? - person fweigl; 10.08.2015
comment
Бьюсь об заклад, вся иерархия представлений для FragmentActivities может измениться между версиями библиотеки поддержки. Например, прямо под DecorView может быть дополнительный FrameLayout. Это будет означать, что Espresso, созданный с другой версией библиотеки поддержки, чем ваше приложение, будет искать представления на неправильном уровне и, следовательно, не сможет ничего найти. - person Tas Morf; 10.08.2015
comment
я использую тест записи эспрессо, он добавляет зависимость сам по себе, но все равно дает мне ту же ошибку. ? - person Kaveesh Kanwal; 25.11.2016