Это действительно хороший вопрос, и я удивлен, что его раньше нигде не задавали / обсуждали.
Ваши рассуждения верны, когда появляется диалоговое окно, иерархия представлений меняется, поэтому onView(withId(R.id.activity_main_navigation_drawer))
дает исключение NoMatchingViewException , Кроме того, присвоение его объекту ViewInteraction
перед открытием диалогового окна не помогает, поскольку Espresso попытается сопоставить объект с использованием новой иерархии представлений, даже если вы хотите использовать старый объект (который сопоставлялся с использованием старой иерархии представлений)
Решение, которое я собираюсь предложить, должно работать для вас, и, насколько я знаю, это единственный способ достичь того, чего вы хотите. Это отчасти противоречит духу тестирования пользовательского интерфейса, так как мы хотим только имитировать действия пользователя и пытаться утверждать вещи так, как пользователь видит систему, но я бы сказал, что это решение все еще в порядке, поскольку мы не взаимодействуем с системой с помощью нашего системного кода. , (мы используем его только для подтверждения чего-либо)
Activity activity = getActivityInstance();
DrawerLayout drawerLayout=(DrawerLayout) activity.findViewById((R.id.drawerlayout));
// your test code
assertFalse(drawerLayout.isDrawerOpen(GravityCompat.START))
// your remaining test code
Метод для getActivityInstance
(Существует более 999999 различных способов получения экземпляра действия. Этот взят из get экземпляр действия
private Activity getActivityInstance(){
final Activity[] currentActivity = {null};
getInstrumentation().runOnMainSync(new Runnable(){
public void run(){
Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
Iterator<Activity> it = resumedActivity.iterator();
currentActivity[0] = it.next();
}
});
return currentActivity[0];
}
В качестве личного предпочтения я не люблю использовать пример активности, если только он не предназначен для проверки чего-то действительно важного, и я действительно не могу проверить это любым другим способом.