Запустите 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 отсюда

Ура, Сильвиу

Другие вопросы по тегам