6

我使用Fragment了 Android 兼容包,使用android-support-v4.jar. 但我不能对此进行 JUnit 测试。

我的主FragmentActivity类声明如下

public class MyActivityClass extends FragmentActivity{
...............
}

然后在我的测试项目中

public class MyActivityClassTest extends ActivityInstrumentationTestCase2<MyActivityClass> {
    public MyActivityClassTest() {  
        super("com.android.myproject", MyActivityClass.class);
    }
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        ...................
    }

    public void testPreconditions() {
        .................
    }
    public void testNotNull(){
        ................
    }
}

但是当我作为Android JUnit Test产生FailedToCreateTests[Runner:Junit3]
失败跟踪运行时

java.lang.RuntimeException: Exception during suite construction
at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:239)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
Caused by: java.lang.reflect.InvocationTargetException
at com.android.myproject.test.MyActivityClassTest.<init>(MyActivityClassTest.java:28)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87)
at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73)
at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:263)
at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:185)
at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:336)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3982)
at android.app.ActivityThread.access$2900(ActivityThread.java:119)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1901)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: com.android.myproject.MyActivityClass
... 19 more

当我更改MyActivityClass为扩展Activity时,它工作正常(MyActivityClass extends Activity)我在我的测试和主项目中都
使用了相同的android-support-v4.jar

4

6 回答 6

7

ActivityInstrumentationTestCase2兼容Fragments。您应该只遵循Android 测试中提到的步骤:外部库,它已经更新以涵盖这种情况android-support-v4.jar

然后,您将能够编写如下测试:

public void testFragmentManager() {
    FragmentActivity activity = getActivity();
    assertNotNull(activity.getSupportFragmentManager());
}

或任何你需要测试的东西。

于 2011-06-28T04:26:34.047 回答
7

我找到了解决方案

问题是

Caused by: java.lang.NoClassDefFoundError: com.android.myproject.MyActivityClass

即使我在两个项目中引用了相同的 jar,它也找不到类路径(我也尝试为两个项目使用单独的 jar)

现在,我在同一个项目中创建了我的测试环境,然后它就可以工作了

在我的AndroidManifest.xml

<manifest...>
    <!-- For doing JUnit test, Instrumentation Start (remove later) -->
    <instrumentation
        android:targetPackage="com.pe.android.isccasinos"
        android:name="android.test.InstrumentationTestRunner" />
    <!-- For doing JUnit test, Instrumentation End (remove later) -->   
    <application ...>
    ................
    <!-- For doing JUnit test, add library starting (remove later) -->
        <uses-library
            android:name="android.test.runner" />
        <!-- For doing JUnit test, add library ending (remove later) -->
    </application>
<manifest>

然后我在我的特殊包中添加了我的测试类进行测试

extends ActivityInstrumentationTestCase2<fragmentActivity>

现在一切正常:)

于 2011-06-28T05:28:30.323 回答
1

请参阅此问题以获得更好的答案:

FragmentActivity 无法通过 ActivityInstrumentationTestCase2 进行测试

您需要从您的应用中导出对兼容性库的引用。

于 2012-02-09T14:15:45.323 回答
1

这已经很晚了,但我通过android-support-v4.jar依赖项添加到主项目并将其从测试项目中删除来解决相同的问题。

然后,确保主项目在测试项目的构建路径上。对任何其他主库和测试项目可能共享的库执行相同的操作。

于 2013-11-23T03:55:23.270 回答
0

我的猜测是ActivityInstrumentationTestCase2Fragments. 你应该尝试类似Robolectric的东西。

于 2011-06-27T18:04:27.527 回答
0

我已经尝试了将近一天来处理这个问题,并从另一篇文章中找到了解决方案

基本上,您在应用程序中使用的 android-support-v4.jar(在我的情况下)应该与您在测试应用程序中使用的相同。最好的方法是从测试项目的 libs 目录中删除相同的 jar,然后从 Application 项目中导出相同的 jar。这样你就可以肯定地摆脱这个问题。

于 2013-11-27T09:39:00.893 回答