Я отслеживал код AndroidJUnit4, пока не узнал, что происходит. Быстрый ответ заключается в том, что все открытые действия автоматически «заканчиваются» перед началом каждого теста. Это делается в android.support.test.runner.MonitoringInstrumentation. Этот класс содержит открытый внутренний класс ActivityFinisher, который реализует Runnable. Метод run для этого класса вызывается перед началом каждого теста. Вот что делает этот код:
public void run() {
List<Activity> activities = new ArrayList<>();
for (Stage s : EnumSet.range(Stage.CREATED, Stage.STOPPED)) {
activities.addAll(mLifecycleMonitor.getActivitiesInStage(s));
}
Log.i(TAG, "Activities that are still in CREATED to STOPPED: " + activities.size());
for (Activity activity : activities) {
if (!activity.isFinishing()) {
try {
Log.i(TAG, "Finishing activity: " + activity);
activity.finish();
} catch (RuntimeException e) {
Log.e(TAG, "Failed to finish activity.", e);
}
}
}
}
Призыв к Activity.finish () является причиной того, почему вы получаете сообщение «Действия не найдены». Суть в том, что AndroidJUnit4 не реализован, чтобы делать то, что вы пытаетесь сделать. Я могу понять, почему вы хотели бы сделать это, но сам по себе AndroidJUnit4Runner не работает таким образом.
Я не исследовал, есть ли простой способ обойти это. Простое, что вы можете сделать, это структурировать свой тестовый класс так, чтобы он содержал только один тест. Запустите действие, которое вы хотите, в методе @Before, и выполните все свои тесты активности в этом единственном методе @Test. Это препятствует тому, чтобы действие было «закончено» и «запущено» снова для каждого теста. Другой возможный способ обойти это - написать свой собственный класс бегуна, который может быть немного больше работы, чем вы хотите. К сожалению, я не знаю достаточно, если этот подход будет работать на самом деле; или вы все равно столкнетесь с той же проблемой.
Я оставляю свой ответ в виде открытого вопроса другим о том, существует ли простой способ сохранить активность андроида открытым в течение нескольких тестов.