Android测试项目找不到app类

时间:2013-03-26 23:17:16

标签: android eclipse junit

我有一个Android应用程序,我试图在Eclipse中使用JUnit进行测试。我创建了一个Android Test项目并添加了一些测试,但是当我尝试在我的设备上运行测试时,每个测试都会在我尝试测试的类上使用java.lang.NoClassDefFoundError失败。

我发现了一些类似的问题,但与我的问题完全不同。最接近的是this,但此用户正在使用Maven并找出使用此方法的解决方法。我没有使用Maven。

以下是LogCat的一些输出:

03-26 13:36:05.281: I/TestRunner(8380): started: testValueOf(com.evertz.android.vlpro.unit.SeverityTest)
03-26 13:36:05.281: I/TestRunner(8380): failed: testValueOf(com.evertz.android.vlpro.unit.SeverityTest)
03-26 13:36:05.281: I/TestRunner(8380): ----- begin exception -----
03-26 13:36:05.281: I/TestRunner(8380): java.lang.NoClassDefFoundError: com.evertz.android.vlpro.Severity
03-26 13:36:05.281: I/TestRunner(8380):     at com.evertz.android.vlpro.unit.SeverityTest.testValueOf(SeverityTest.java:19)
03-26 13:36:05.281: I/TestRunner(8380):     at java.lang.reflect.Method.invokeNative(Native Method)
03-26 13:36:05.281: I/TestRunner(8380):     at java.lang.reflect.Method.invoke(Method.java:511)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestCase.runTest(TestCase.java:168)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestCase.runBare(TestCase.java:134)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestResult$1.protect(TestResult.java:115)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestResult.runProtected(TestResult.java:133)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestResult.run(TestResult.java:118)
03-26 13:36:05.281: I/TestRunner(8380):     at junit.framework.TestCase.run(TestCase.java:124)
03-26 13:36:05.281: I/TestRunner(8380):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
03-26 13:36:05.281: I/TestRunner(8380):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
03-26 13:36:05.281: I/TestRunner(8380):     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
03-26 13:36:05.281: I/TestRunner(8380):     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
03-26 13:36:05.281: I/TestRunner(8380): ----- end exception -----
03-26 13:36:05.281: I/TestRunner(8380): finished: testValueOf(com.evertz.android.vlpro.unit.SeverityTest)

我有其他使用JUnit测试的Android项目,效果很好。这是一个简短的总结:

  • Utils:一个Android库项目,其中包含从我现有的Java代码库和Android-ified复制的多个实用程序类。
  • UtilsTest:Utils项目中类的相应单元测试。有对easymock.jar的引用。这些测试在设备上运行得非常好。
  • AppOne:一个简单的Android应用程序,不依赖于Utils,EasyMock或其他任何东西。
  • AppOneTest:AppOne类的单元测试。这些测试也运行良好。
  • AppTwo:一个依赖于Utils库项目的Android应用程序。
  • AppTwoTest:AppTwo类的单元测试。依赖于Utils和EasyMock。所有这些测试都失败了,如上所述(找不到测试类)。

所有测试类都使用JUnit3语义(扩展TestCase,没有注释等)。所测试的类都没有基于活动(尚未)。我现在只是测试支持类,这些只有对Android SDK类的小引用(例如android.util.Log,android.graphics.Color)。

我认为有外部依赖可能会以某种方式导致问题,所以我尝试在AppOne和AppOneTest中向Utils类添加一些(不必要的)调用,但这些测试仍然有效。我还尝试删除AppTwoTest中的所有测试,除了没有引用Utils或EasyMock(来自LogCat输出的SeverityTest类)的测试,这仍然失败。

我尝试了干净的构建,重新启动Eclipse,删除并重新创建了AppTwoTest项目,似乎没有任何工作。关于什么可能导致这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

检查测试应用的清单,它应包含以下内容:

  1. 测试代码的包定义

  2. 使用适合您应用的sdk

  3. 在测试运动员中链接的use-library

  4. 带有应用代码链接的工具

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"      <!-- package of the test code -->
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.app" />      <!-- package of the app code -->
    
    <application android:allowBackup="false">
        <!-- linkage for the test runner -->
        <uses-library android:name="android.test.runner" />     
    </application>