0

アプリケーションで 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) を使用すると、テストは完全に実行されます。

重要なことの 1 つは、アクティビティ クラスが 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、inject の依存関係をアプリケーションの libs フォルダーにコピーすると (そして依存関係を pom.xml で提供されているものとしてマークすると)、Eclipse 上でテストが美しく実行されることに注意してください。そのため、ADT で実行されている Android 単体テストが Maven の依存関係を識別できないという問題があるようです。

この問題に非常に似ているようです: Android/RoboGuice/Maven: ClassNotFoundException in Eclipse, but not from Maven command line , しかし、実際のアプリケーションではなく単体テストを実行している場合。

この問題を回避する方法についてのアイデアは大歓迎です。

4

1 に答える 1

-1

問題が見つかったようです。

Eclipse で 2 つのプロジェクトを使用しています。実際には 3 つです。1 つは親、1 つはアプリケーション用、もう 1 つはテスト用です。

NoClassDefFoundError の問題は、Eclipse 内からテストを実行する際に、RoboGuice のクラスが間違った依存関係からロードされることが原因でした。

LogCat ビューのエラーの少し上に、「... 以前の検証中に別の Lroboguice/util/RoboContext を使用していました。」

問題を解決したように見えるのは、(不要な) 依存関係をテスト プロジェクトから削除し、実際のアプリケーション プロジェクトのみに保持することでした。これで、maven と eclipse の両方ですべてが正常に動作するようになりました。

これは、Eclipse での dex 生成が RoboGuice jar を複数回処理し、テスト対象のアプリケーションの実行時に異なる参照を生成していたことを示しているようです。依存関係が実際に必要な場合、これを解決する方法がわかりません。

他の人に役立つことを期待して、ここでこれに答えると思いました...

于 2012-08-17T22:32:25.743 に答える