2011-06-27 232 views
6

我使用Android Compatibility Package的Fragment,使用android-support-v4.jar。但是我无法对此进行JUnit测试。FragmentActivity Junit测试

我的主要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(){ 
     ................ 
    } 
} 

如下

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

然后但当我为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在我的测试和主体工程

回答

7

我找到了解决办法

的问题

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

它无法找到,即使我是指在两个项目中相同的罐子类路径中(我也可以通过使用单独的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> 

现在一切正常:)

+2

这成功解决了它,但编号仍然想知道为什么它发生在使用单独的测试项目时... – brk3

0

我的猜测是ActivityInstrumentationTestCase2不与Fragments兼容。 你应该尝试类似Robolectric

+0

不,它是兼容的。当我在同一个项目中创建了我的测试。感谢Marcarse提供的链接。 :) –

7

ActivityInstrumentationTestCase2Fragments兼容。您只应遵循Android Testing: External libraries中提到的步骤,该步骤已更新以覆盖android-support-v4.jar的情况。

然后,你就可以编写测试像这样的:

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

或任何你需要测试。

+0

谢谢Dtmilano,您提供的链接确实很有帮助,但我已经添加了外部库的构建路径。对我来说还是运气不好。当我在同一个项目中创建我的测试时,它工作:) –

+0

您发布的是一种解决方法,它将导致您遇到另一个问题:如何不向您的应用发布测试。 –

+0

你在使用Eclipse吗?我确定它可以工作,因为我正在使用它。 –

1

这是晚了,但我通过加入Android的支持,v4.jar依赖于主体工程,并从测试项目中删除它解决了同样的问题。

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

0

我已经试过几乎每天要处理这个问题,并发现从另一个post

基本上你的Android的支持,v4.jar溶液(在我的情况),在应用程序使用应该是相同的什么你在你的测试应用程序中使用过。最好的办法是从测试项目的libs目录中删除相同的jar文件,并从你的Application项目中导出相同的jar文件。这样你就可以摆脱这个问题。