【问题标题】:FragmentActivity Junit TestingFragmentActivity Junit 测试
【发布时间】:2011-06-27 10:02:39
【问题描述】:

我使用了Fragment的Android Compatibility Package,使用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]
Failure Trace

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

【问题讨论】:

    标签: android unit-testing fragment


    【解决方案1】:

    ActivityInstrumentationTestCase2Fragments 兼容。您应该只按照Android Testing: External libraries 中提到的步骤进行操作,该步骤已更新以涵盖android-support-v4.jar 的情况。

    然后,您将能够编写这样的测试:

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

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

    【讨论】:

    • 感谢 Dtmilano,您提供的链接确实很有帮助,但我已经添加了外部库的构建路径。还是我运气不好。当我在同一个项目中创建测试时,它起作用了:)
    • 您发布的是一种解决方法,这会导致您遇到另一个问题:如何不将测试与您的应用一起发布。
    • 你在使用 Eclipse 吗?我确定它有效,因为我正在使用它。
    • 是的,我使用 eclipse :( 如果我使用与测试相同的项目,那以后会给我带来问题吗?:( 我想在完成我的项目后,我将删除额外的测试包和清单条目测试。这样可以吗?
    • follow dtmilano.blogspot.com/2009/12/… 在测试项目中运行ant ant build ant debug 时还是遇到了compile。如:包android.support.v4.app不存在[javac] import android.support.v4.app.FragmentActivity;
    【解决方案2】:

    我找到了解决办法

    问题是

    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>
    

    现在一切正常:)

    【讨论】:

    • 这成功地解决了它,但我仍然想知道为什么在使用单独的测试项目时会发生这种情况......
    【解决方案3】:

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

    FragmentActivity can not be tested via ActivityInstrumentationTestCase2

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我的猜测是ActivityInstrumentationTestCase2Fragments 不兼容。 你应该试试Robolectric

        【讨论】:

        • 不兼容。当我在同一个项目中创建我的测试时,它起作用了。感谢 Marcarse 的链接。 :)
        【解决方案6】:

        我已经尝试了将近一天的时间来处理这个问题,并从另一个post找到了解决方案

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-23
          • 1970-01-01
          • 2020-07-26
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多