1

我正在做一个需要开始测试其他应用程序的应用程序。
想法是您选择一个应用程序(从列表中),然后为它选择一个测试用例。例如:您选择 facebook,然后测试登录。facebook 应用程序的测试用例开始(使用机器人黑盒测试)。
我创建了测试,如果我从 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
有没有人有任何想法来解决这个问题?
谢谢。

4

1 回答 1

0

我遇到了这个问题,我的解决方案包括使用 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这里模拟。

干杯,西尔维乌

于 2012-05-23T09:40:04.243 回答