从活动启动Android JUnit

时间:2012-05-22 20:17:25

标签: android junit robotium

我正在做一个需要开始测试其他应用的应用 想法是你选择一个应用程序(从列表中),然后选择一个测试用例。例如:您选择Facebook然后测试登录。 Facebook应用程序的测试用例开始(使用robotium黑盒测试) 我创建了测试,如果我从eclipse作为Android JUnit启动它,它工作正常。但是,我不能从我的应用程序启动它。我认为我可以使用一些意图开始测试但不能(我试过这个,因为我在Manage Apps中看到了测试 - > All)。我也试过使用广播接收器 - 测试应用接收广播,但是当我尝试实例化测试时,构造函数需要调用super(TARGET_PACKAGE_ID,launcherActivityClass); public static final String TARGET_PACKAGE_ID =“com.facebook.katana”; public static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME =“com.facebook.katana.LoginActivity”;我的应用程序崩溃:java.lang.ClassNotFoundException:com.facebook.katana.LoginActivity
有没有人有任何想法来解决这个问题? 感谢。

1 个答案:

答案 0 :(得分: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();
}

我不能完全相信代码,我在某处看到类似的东西(用于其他目的),但我不记得在哪里。

基本上,代码正在尝试从here模拟runInstrument

干杯, 西尔维乌