2011-06-27 230 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文件。這樣你就可以擺脫這個問題。