Intereting Posts
Камера Android – Как я могу взять конкретный «прямоугольник» из массива байтов? Google TV – разрабатывает для эффективности так же важно, как и с телефонами / планшетами? Исключение Proguard при создании release android apk Будет ли разумная защита этой политики в отношении LVL LVL? Запись SD-карты на Android, разрешение отклонено Osmdroid – более высокий уровень масштабирования? Как проверить, что произойдет, когда вы опубликуете обновление для своего приложения на Market Default Drawer View View для ExpandableListView Невозможно выполнить dex: несколько файлов dex определяют массив Lcom / myapp / R $; Как уведомить веб-браузер Dolphin, когда он удаляется? Область Warp Image при касании точки? Использование RoboSpice – это способ получить код ошибки HTTP из исключения? Как преобразовать строку Base64 в образ BitMap, чтобы показать его в ImageView? Идея электронной почты для Android Android Wifi Direct: предотвращение принятия пользователем при подключении к известному партнеру

Получить текущую активность в эспрессо-андроиде

В случае теста, который пересекает несколько видов деятельности, существует ли способ получить текущую деятельность?

Метод getActivtiy () просто дает одно действие, которое использовалось для запуска теста.

Я попробовал что-то вроде ниже,

public Activity getCurrentActivity() { Activity activity = null; ActivityManager am = (ActivityManager) this.getActivity().getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); try { Class<?> myClass = taskInfo.get(0).topActivity.getClass(); activity = (Activity) myClass.newInstance(); } catch (Exception e) { } return activity; } 

Но я получаю нулевой объект.

Solutions Collecting From Web of "Получить текущую активность в эспрессо-андроиде"

В Espresso вы можете использовать ActivityLifecycleMonitorRegistry но он официально не поддерживается, поэтому он может не работать в будущих версиях.

Вот как это работает:

 Activity getCurrentActivity() throws Throwable { getInstrumentation().waitForIdleSync(); final Activity[] activity = new Activity[1]; runTestOnUiThread(new Runnable() { @Override public void run() { java.util.Collection<Activity> activities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED); activity[0] = Iterables.getOnlyElement(activities); }}); return activity[0]; } 

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

 intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class))); 

Espresso также покажет вам намерения, выпущенные тем временем, если они не совпадают с вашими.

Единственная настройка, в которой вы нуждаетесь, – это заменить ActivityTestRule на IntentsTestRule в тесте, чтобы он отслеживал запуск намерений. И убедитесь, что эта библиотека находится в ваших зависимостях build.gradle :

 androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.1' 

Если у вас есть единственное действие в вашем тестовом примере, вы можете сделать:

1. объявите тестовое Rule

 @Rule public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class); 

2. Получите информацию о Activity :

 mActivityTestRule.getActivity() 

Это кусок пирога!

Мне нравится версия @ Райана, поскольку она не использует недокументированные внутренности, но вы можете написать это еще короче:

 private Activity getCurrentActivity() { final Activity[] activity = new Activity[1]; onView(isRoot()).check(new ViewAssertion() { @Override public void check(View view, NoMatchingViewException noViewFoundException) { activity[0] = (Activity) view.getContext(); } }); return activity[0]; } 

Помните, что это не сработает при выполнении тестов в Firebase Test Lab. Это не с

 java.lang.ClassCastException: com.android.internal.policy.DecorContext cannot be cast to android.app.Activity 
 public static Activity getActivity() { final Activity[] currentActivity = new Activity[1]; onView(allOf(withId(android.R.id.content), isDisplayed())).perform(new ViewAction() { @Override public Matcher<View> getConstraints() { return isAssignableFrom(View.class); } @Override public String getDescription() { return "getting text from a TextView"; } @Override public void perform(UiController uiController, View view) { if (view.getContext() instanceof Activity) { Activity activity1 = ((Activity)view.getContext()); currentActivity[0] = activity1; } } }); return currentActivity[0]; } 

build.gradle

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

И в вашем тестовом классе Instrumented

  @Rule public ActivityTestRule<MainActivity> intentsTestRule = new ActivityTestRule<>(MainActivity.class); MainActivity mainActivity; @Before public void setUp() throws Exception { mainActivity = intentsTestRule.getActivity(); //now Activity's view gets created //Because Activity's view creation happens in UI Thread, so all the test cases, here, are used by UI Thread }