Запустите Android JUnit из действия
Я делаю приложение, которое должно начать тестировать другие приложения.
Идея состоит в том, что вы выбираете приложение (из списка), а затем тестовый пример для него. Например: вы выбираете Facebook, а затем проверить логин. Запускается тестовый пример для приложения facebook (с использованием тестирования черного ящика robotium).
Я создал тест, и он отлично работает, если я запускаю его из Eclipse как Android JUnit. Однако я не могу запустить его из своего приложения. Я думал, что смогу запустить тест, используя какое-то намерение, но не смог (я попробовал это, потому что я видел тест в Manage Apps->All) Я также пытался использовать широковещательный приемник - тестовое приложение получает широковещательную рассылку, но когда я пытаюсь создать экземпляр теста, конструктор должен вызвать super(TARGET_PACKAGE_ID, launcherActivityClass); где public static final String TARGET_PACKAGE_ID = "com.facebook.katana"; общедоступная статическая конечная строка LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.facebook.katana.LoginActivity"; и я приложение вылетает с: java.lang.ClassNotFoundException: com.facebook.katana.LoginActivity
У кого-нибудь есть идеи для решения этой проблемы?
Благодарю.
1 ответ
У меня была эта проблема, и мое решение состоит в том, чтобы использовать отражение Java для получения ActivityManagerNative, а затем вызывать его методы для запуска тестов.
Итак, мой код выглядит так:
try {
Class<?> ActivityManagerNative = Class
.forName("android.app.ActivityManagerNative");
Log.e("LOADED", "" + ActivityManagerNative);
Method getDefault = ActivityManagerNative.getMethod("getDefault",
(Class<?>[]) null);
Class<?> IActivityManager = Class
.forName("android.app.IActivityManager");
Object am = IActivityManager.cast(getDefault.invoke(
ActivityManagerNative, (Object[]) null));
Class<?> IInstrumentationWatcher = Class
.forName("android.app.IInstrumentationWatcher");
Method startInstrumentation = IActivityManager.getMethod(
"startInstrumentation", ComponentName.class, String.class,
Integer.TYPE, Bundle.class, IInstrumentationWatcher);
ComponentName cn = ComponentName
.unflattenFromString("your.test.package/android.test.InstrumentationTestRunner");
Bundle bundle = new Bundle();
startInstrumentation.invoke(am, cn, null, 0, bundle, null);
} catch (Exception e) {
e.printStackTrace();
}
Я не могу полностью отдать должное за код, я где-то видел нечто подобное (использованное для других целей), но не могу вспомнить, где.
В основном, код пытается симулировать runInstrument
отсюда
Ура, Сильвиу