2011-04-22 69 views
4

每次我開始我的Android儀器測試失敗,java.lang.NoClassDefFoundError在android.test.ServiceTestCase

android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests: 
Error in testSuiteConstructionFailed: 
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:520) 
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 
Caused by: java.lang.reflect.InvocationTargetException 
    at com.samy4me.test.Test_Service2.<init>(Test_Service2.java:26) 
    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:373) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4218) 
    at android.app.ActivityThread.access$3000(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NoClassDefFoundError: com.XXX.ws.Service 
    ... 19 more 

類是存在的。我檢查了ProGuard,我暫時停用了ProGuard。我把測試減少到絕對最小值:

public class Test_Service2 
    extends android.test.ServiceTestCase<Service> 
{ 

    public Test_Service2() 
    { 
     super (Service.class); 
    } // Test_Service2 
} // Test_Service2 

有沒有人知道這可能是怎麼產生的?

更仔細地觀察我現在發現:

04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580): Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  at dalvik.system.DexFile.defineClass(Native Method) 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:209) 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:203) 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
04-23 15:56:21.186 W/ClassPathPackageInfoSource( 580):  ... 26 more 

這是原來的錯誤例外鏈的一部分,但被截斷。預先驗證的例外情況並非新鮮事,也是Android開發的又一痛苦。

回答

10

好的,我發現問題 - 主要是PEBKAC。所以這裏是:

  1. 我只看着控制檯。但是那裏的錯誤信息被截斷了。獲得的經驗:總是檢查logcat以及
  2. 真正的錯誤是衆所周知的預先驗證錯誤發生在圖書館爲主應用程序拖動到測試應用程序時發生。教訓:始終確保庫不拖入儀器測試

如果你使用Maven - 像我這樣做 - 那麼你可以閱讀細節在這裏Automate Android Test Project,這 - 我寫 - 爲增加的尷尬我兩個星期前。

+0

BTW - 在Eclipse ADT中,這意味着您需要右鍵單擊測試項目,選擇'Properties' - >'Java Build Path',從'Projects'中移除您的目標項目包含的庫。此外,單擊「Android」,並在「庫」框中,刪除目標項目中包含的任何項目。 – jwir3 2014-02-14 18:45:31

0

該測試是正確的,應該工作。 請確保ServiceService.class指的是com.XXX.ws.Service而不是android.app.Service

+0

我試過完全合格的命名只是爲了確保它仍然沒有工作。我嘗試重命名Service for Service2,以確保當時的錯誤消息告訴我Service2缺失。 這很煩人,因爲如你所說:它應該工作。也許AndroidManifest.xml中存在問題。 – Martin 2011-04-23 11:30:02