Как определить, запущено ли приложение Android с помощью инструментария тестирования JUnit?

Мне нужно определить во время выполнения из кода, если приложение запускается в TestInstrumentation.

Я мог бы инициализировать тестовую среду с помощью некоторой переменной env / system, но конфигурация запуска Eclipse ADK не позволила бы мне это сделать.

По умолчанию свойства и среда системы Android не имеют никаких данных об этом. Более того, они одинаково одинаковы, независимо от того, запускается ли приложение регулярно или тестируется.

Это может быть решение: можно ли узнать, работает ли приложение Android как часть контрольного теста, но поскольку я не тестирую действия, все предлагаемые методы там не будут работать. Метод ActivityManager.isRunningInTestHarness () использует это под капотом:

SystemProperties.getBoolean("ro.test_harness") 

Который всегда возвращает false в моем случае. (Для работы со скрытым классом android.os.SystemProperties я использую отражение).

Что еще я могу сделать, чтобы попытаться определить внутри приложения, если он находится под тестированием?

Я нашел одно хакерское решение: из приложения можно попробовать загрузить класс из тестового пакета. Аппликационный загрузчик классов неожиданно может загружать классы по имени из проекта тестирования, если он был запущен под тестированием. В другом случае класс не найден.

 private static boolean isTestMode() { boolean result; try { application.getClassLoader().loadClass("foo.bar.test.SomeTest"); // alternatively (see the comment below): // Class.forName("foo.bar.test.SomeTest"); result = true; } catch (final Exception e) { result = false; } return result; } 

Я признаю, что это не изящно, но это работает. Будем благодарны за правильное решение.

Решение isTestMode () не работает для меня на Android Studio 1.2.1.1. Всемогущий Krzysztof из нашей компании изменил ваш метод, используя:

 Class.forName("foo.bar.test.SomeTest"); 

Вместо getClassLoader (). Спасибо за Кшиштофа!

Мы создали решение для передачи параметров в MainActivity и используем его внутри метода onCreate, позволяя вам определить, как будет создана Activity.

В классе MainActivity мы создали некоторые константы, которые также могут быть перечислением. Мы также создали статический атрибут.

 public class MainActivity { public static final int APPLICATION_MODE = 5; public static final int UNIT_TEST_MODE = 10; public static final int OTHER_MODE = 15; public static int activityMode = APPLICATION_MODE; (...) @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); switch (activityMode) { case OTHER_MODE: (...) break; case UNIT_TEST_MODE: Log.d(TAG, "Is in Test Mode!"); break; case APPLICATION_MODE: (...) break; } (...) } (...) } 

Мы составили MainActivityTest класс MainActivityTest , создали setApplicationMode и вызвали этот метод внутри метода setUp() , прежде чем вызывать метод super.setUp() .

 public abstract class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { protected void setUp() throws Exception { setApplicationMode(); // <===== super.setUp(); getActivity(); (...) } (...) public void setApplicationMode() { MainActivity.activityMode = MainActivity.UNIT_TEST_MODE; } } 

Все остальные классы тестов наследуют от MainActivityTest , если мы хотим, чтобы у него было другое поведение, мы можем просто переопределить метод setApplicationMode .

 public class OtherMainActivityTest extends MainActivityTest { (...) @Override public void setApplicationMode() { MainActivity.activityMode = MainActivity.OTHER_MODE; } } 

Пользователь nathan-almeida является другом, который является соавтором этого решения.

Intereting Posts
Обновить текущую активность без задержки Android – Показать / Скрыть системную панель на 4.2.2 (Nexus 10) Android SDK Manager – вам нужно установить все платформы Android? Как программно определить, какой формат XML используют мои приложения для Android? Эксклюзивный CSS для iPhone / Android Android RatingBar – полный беспорядок Сенсор Android TYPE_LINEAR_ACCELERATION – что он показывает? FLAG_ACTIVITY_REORDER_TO_TOP вызывает RuntimeException или черный экран при вращении Тот же Keystore для разных приложений Android – Сервис – метод onDestroy (), который не вызывается при использовании Force Stop Android Connect Физическое устройство как устройство АБР, а не портативное устройство Как загрузить библиотеку поддержки Android v7 в проект Android SBT? Android – Maven Build – Proguard – не может найти ссылочный класс Android: получить экземпляр из службы, запущенной Не удалось выполнить тестовый прогон: сбой инструментария из-за «java.lang.ClassNotFoundException»