2015-08-07 3 views
3

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

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

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 тестов терпит неудачу, потому что View с предоставленным идентификатором не найден:

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 проверяет только взгляды в планете активности ut, а не те, которые предоставляются ViewPager.

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

b. Действительно ли Espresso должен найти View s в пределах Fragments внутри a ViewPager?

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

@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: Вы можете взглянуть на весь проект on GitHub.

+0

Сначала попробуйте настроить свои тесты с помощью Junit: https: // github.ком/googlesamples/Android-тестирование-шаблоны/BLOB/Master/AndroidTestingBlueprint/приложение/SRC/androidTest/Java/COM/пример/Android/тестирование/план/UI/эспрессо/EspressoTest.java. Кроме того, убедитесь, что у вас есть правильные зависимости: https://github.com/googlesamples/android-testing-templates/blob/master/AndroidTestingBlueprint/app/build.gradle –

+0

@JaredBurrows Я включил указанные зависимости и написал свой тест в соответствии с к их примеру эффект остается прежним. – FWeigl

+0

Ах, coudl вы также публикуете свой XML и код? –

ответ

3

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

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

+0

Ничего себе, вы были на месте! Не могли бы вы вкратце объяснить, почему метод findView не работает, если проекты явно не добавляют последнюю версию com.android.support:support-v4:22.2.1 в качестве зависимости? – FWeigl

+1

Я уверен, что вся иерархия представлений для FragmentActivities может измениться между версиями библиотеки поддержки. Например, может быть дополнительный FrameLayout прямо под DecorView. Это означало бы, что Espresso, построенный с другой версией библиотеки поддержки, чем ваше приложение, будет искать представления на неправильном уровне, следовательно, не сможет ничего найти. –

+0

Хорошо, спасибо! – FWeigl

Смежные вопросы