4

まず、ここここのような同様の質問がありますが、外部ライブラリもlibフォルダーも、含まれているjarもいくつかないので、AndroidJunitテストを実行して何が間違っているのか疑問に思います。

私のプロジェクト構造は次のようになります。
ここに画像の説明を入力してください

ご覧のとおり、AndroidJUnitテスト用の別のプロジェクトがあります。テストクラスは次のようになります。

public class PersistenceManager {
    private static final String FILENAME = "kpzwien_storage";

    public static void persist(String data, Context context) throws IOException  {
        FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
        fos.write(data.getBytes());
        fos.close();
    }

    public static String read(Context context) throws IOException  {
        FileInputStream fis = context.openFileInput(FILENAME);
        StringBuffer fileContent = new StringBuffer("");

        byte[] buffer = new byte[1024];
        while (fis.read(buffer) != -1) {
            fileContent.append(new String(buffer));
        }

        return fileContent.toString();
    }
}

そしてここにそのテストケースがあります:

public class PersistenceManagerTest extends AndroidTestCase {

    private final String FILENAME_PREFIX = "test.";

    @Before
    public void setUp() {
        MockContentResolver resolver = new MockContentResolver();
        RenamingDelegatingContext renamingDelegatingContext = new RenamingDelegatingContext(new MockContext(), getContext(), FILENAME_PREFIX);
        Context context = new IsolatedContext(resolver, renamingDelegatingContext);

        setContext(context);
    }

    public void testPersistAndRead() throws IOException {
        String testData = "foobar";

        PersistenceManager.persist(testData, getContext());

        String result = PersistenceManager.read(getContext());

        assertEquals(testData, result);
    }
}

テストプロジェクトのマニフェストは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.devgems.android.kurzparkzonewien.androidtests"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="net.devgems.android.kurzparkzonewien.activities" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>
</manifest>

targetPackageは、Instrumentationオブジェクトが実行されるアプリケーションであり、マニフェストファイルで要素によって割り当てられたパッケージ名によって識別されます。(出典:http ://developer.android.com/guide/topics/manifest/instrumentation-element.html

私のメインプロジェクトのパッケージの名前は

package = "net.devgems.android.kurzparkzonewien.activities"

つまり、targetPackageが指す場所です。「AndroidJUnitテスト」として実行すると、常にNoClassDefFoundErrorが発生しますが、なぜですか?何か案は?私はADT20.0.3、 EclipseJunoを使用しています

最後に、logcatの出力は次のとおりです。

09-22 16:00:12.745:I / TestRunner(1528):java.lang.NoClassDefFoundError:net.devgems.android.kurzparkzonewien.controller.PersistenceManager 09-22 16:00:12.745:I / TestRunner(1528):at net.devgems.android.kurzparkzonewien.androidtests.PersistenceManagerTest.testPersistAndRead(PersistenceManagerTest.java:32)09-22 16:00:12.745:I / TestRunner(1528):at java.lang.reflect.Method.invokeNative(Native Method) 09-22 16:00:12.745:I / TestRunner(1528):at java.lang.reflect.Method.invoke(Method.java:521)09-22 16:00:12.745:I / TestRunner(1528):at junit.framework.TestCase.runTest(TestCase.java:154)09-22 16:00:12.745:I / TestRunner(1528):junit.framework.TestCase.runBare(TestCase.java:127)09-22 16: 00:12.745:I / TestRunner(1528):junit.framework.TestResult $ 1.protect(TestResult.java:106)09-22 16:00:12.745:I / TestRunner(1528):junit.framework.TestResult.runProtected(TestResult.java:124)09-22 16:00:12.745:I / TestRunner(1528):junit.framework.TestResult.run(TestResult.java) :109)09-22 16:00:12.745:I / TestRunner(1528):junit.framework.TestCase.run(TestCase.java:118)09-22 16:00:12.745:I / TestRunner(1528): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)09-22 16:00:12.745:I / TestRunner(1528):at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)09-22 16 :00:12.745:I / TestRunner(1528):android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)09-22 16:00:12.745:I / TestRunner(1528):android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1447)09-22 16:00:12.745:I / TestRunner(1528):-----終了例外----------終了例外-----

4

1 に答える 1

2

私は解決策を見つけました。しかし、私は通常このようにいじくり回す必要があることを想像できないため、実際にはある種の回避策です(おそらく誰かがより良い解決策を知っていますか?):

私のメインプロジェクトはMavenプロジェクトです。このプロジェクトでは、構成済みの出力フォルダーを/bin...から/ target/ classestarget / test-classestarget/generated-sourcesに設定する必要があります。そうしないと、 mvn installを実行しない限り、メインプロジェクトからのJUnitテストで最新のコード変更が検出されないためです。。出力フォルダーがtarget/...の場合、テストで最新の変更を行うためにmvninstallを実行する必要はありません。
問題は、Androidテストプロジェクトがメインプロジェクトのターゲットに保存されているときに、コンパイルされたソースを見つけられないことです。メインプロジェクトの出力フォルダーをbinに設定してmvninstallを実行すると、Androidテストプロジェクトはクラスを見つけることができます。私はこれを一度だけしなければなりません。ターゲットに戻すと、AndroidテストとメインのJUnitテストの両方が実行されます。メインプロジェクトのメソッドを変更すると、テストプロジェクトはすぐに変更を認識します。つまり、バイナリjarなどを使用しません(これは非常に優れていますが、なぜ今それが見つかるのかはわかりませんが、ターゲットに戻しましたか?)

[更新]
これらの2行をメインプロジェクトのpomtobuildセクションに追加すると問題が解決するため、回避策はもう必要ありません。

    <outputDirectory>bin/classes</outputDirectory>
    <testOutputDirectory>bin/test-classes</testOutputDirectory>
于 2012-09-27T20:11:18.410 に答える