Android,RoboGuice 2.0,ActivityInstrumentationTestCase2在Eclipse上使用NoClassDefFoundError失败,与maven一起使用

时间:2012-08-14 13:12:25

标签: android eclipse maven integration-testing roboguice

在我们的应用程序中使用RoboGuice 2.0时,我们在eclipse中运行集成单元测试时遇到问题。

当我们尝试在模拟器上运行单元测试类时(作为Android JUnit测试),我们得到以下异常,因此测试甚至不运行:

junit.framework.AssertionFailedError: Exception in constructor: testAddNote (java.lang.NoClassDefFoundError: br.org.certi.android.pgpsip.client.measure.activity.MeasureActivity
at br.org.certi.android.pgpsip.client.test.MeasureActivityTest.<init>(MeasureActivityTest.java:14)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
at junit.runner.BaseTestRunner.getTest(BaseTestRunner.java:103)
at android.test.AndroidTestRunner.getTest(AndroidTestRunner.java:127)
at android.test.AndroidTestRunner.setTestClassName(AndroidTestRunner.java:55)
at android.test.suitebuilder.TestSuiteBuilder.addTestClassByName(TestSuiteBuilder.java:81)
at android.test.InstrumentationTestRunner.parseTestClass(InstrumentationTestRunner.java:418)
at android.test.InstrumentationTestRunner.parseTestClasses(InstrumentationTestRunner.java:399)
at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:364)
...

这是测试类的相关部分,我希望它足够了:

public class MeasureActivityTest extends ActivityInstrumentationTestCase2<MeasureActivity> {

public MeasureActivityTest() {
    super(MeasureActivity.class);
}

使用maven(mvn clean install)测试运行完美。

一个重要的事情是,如果活动类不依赖于RoboGuice,它也可以在eclipse上正常工作。

pom.xml的相关部分:

<dependency>
    <groupId>org.roboguice</groupId>
    <artifactId>roboguice</artifactId>
    <version>2.0</version>
</dependency>
<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-multibindings</artifactId>
    <version>3.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
        </exclusion>
    </exclusions>
</dependency>

我们注意到,当我们复制roboguice,guice并将依赖项注入应用程序的libs文件夹(并标记pom.xml上提供的依赖项)时,测试会在eclipse上运行得很漂亮。因此,似乎是在ADT中运行的Android单元测试无法识别maven依赖项的问题。

这个问题似乎很相似: Android/RoboGuice/Maven: ClassNotFoundException in Eclipse, but not from Maven command line,但是在运行单元测试而不是实际应用程序时。

如何解决这个问题的任何想法将不胜感激。

1 个答案:

答案 0 :(得分:-1)

我们似乎找到了问题。

我们在eclipse上使用了两个项目,实际上是三个:一个是父项,一个是应用程序,另一个是测试。

NoClassDefFoundError问题来自于从eclipse中运行测试时从错误的依赖项加载的RoboGuice类。

我们注意到一条消息:“......使用了不同的Lroboguice / util / RoboContext;在预验证期间...”,略高于LogCat视图中的错误。

似乎解决了这个问题的方法是从测试中删除(不需要的)依赖项 项目并只保留在实际的应用程序项目中,现在一切都可以正常使用maven和eclipse。

这似乎表明使用eclipse的dex生成不止一次地处理RoboGuice jar,在运行要测试的应用程序时生成不同的引用。如果实际需要依赖,我不知道如何解决这个问题。

以为我会在这里回答这个问题,希望能帮助别人......