3

EclipseでJUnitを使用してテストしようとしているAndroidアプリがあります。Androidテストプロジェクトを作成していくつかのテストを追加しましたが、デバイスでテストを実行しようとすると、テストしようとしているクラスですべてのテストがjava.lang.NoClassDefFoundErrorで失敗します。

私はいくつかの同様の質問を見つけましたが、私の問題とまったく同じものは何もありません。最も近いのはこれですが、このユーザーは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:既存のJavaコードベースからコピーされAndroid化されたいくつかのユーティリティクラスを備えたAndroidライブラリプロジェクト。
  • UtilsTest:Utilsプロジェクトのクラスに対応する単体テスト。easymock.jarへの参照があります。これらのテストは、デバイス上で完全に正常に実行されます。
  • AppOne:Utils、EasyMock、その他に依存しないシンプルなAndroidアプリ。
  • AppOneTest:AppOneクラスの単体テスト。これらのテストも正常に実行されます。
  • AppTwo:Utilsライブラリプロジェクトに依存するAndroidアプリ。
  • AppTwoTest:AppTwoクラスの単体テスト。UtilsとEasyMockに依存しています。上記のように、これらのテストはすべて失敗します(テスト中のクラスが見つかりません)。

すべてのテストクラスはJUnit3セマンティクスを使用しています(TestCaseを拡張する、アノテーションなしなど)。テスト中のクラスはどれもアクティビティベースではありません(まだ)。今のところサポートクラスをテストしていますが、これらにはAndroid SDKクラス(例:android.util.Log、android.graphics.Color)へのマイナーな参照しかありません。

外部依存関係があると何らかの問題が発生する可能性があると考えたため、AppOneおよびAppOneTestのUtilsクラスにいくつかの(不要な)呼び出しを追加しようとしましたが、これらのテストは引き続き機能しました。また、UtilsまたはEasyMock(LogCat出力のSeverityTestクラス)を参照しないテストを除いて、AppTwoTestからすべてのテストを削除しようとしましたが、それでも失敗しました。

クリーンビルドを試し、Eclipseを再起動し、AppTwoTestプロジェクトを削除して再作成しましたが、何も機能しないようです。この問題の原因について何か考えはありますか?

4

1 に答える 1

1

テストアプリのマニフェストを確認してください。次のものが含まれている必要があります。

  1. テストコードのパッケージ定義

  2. 用途-アプリに適したSDK

  3. 使用-テストランナーでリンクするライブラリ

  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>
    

于 2013-03-27T02:01:04.187 に答える