4

私は毎日、Eclipse 内から Android 以外の JUnit テストを実行しています。今日は、Android ライブラリ クラスのいくつかをテストしたいと思いました。ああ、痛み。

Android-maven-plugin を使用した Android ライブラリ プロジェクトがあります。にソース ファイルがsrc/main/javaあり、(新しい) 単体テストが にありsrc/test/javaます。私のPOMには、適切なJUnit依存関係とandroid-maven-plugin参照があります。

からAndroidUriインスタンスを作成することがありますFile。から作成した既存の JavaURIインスタンスを にFile変換することがありUriます。私はファイルと URI に関して Java も Android も信頼していないので (Java が URI の UNC パスをどのように壊すのか、または Javaequals()が URI のコントラクトをどのように壊すのかについて始めないでください)、一時ファイルを作成するための簡単な単体テストを作成したいと思いました。 、 Uris2 つの異なるアプローチから作成し、それらが等しくなるようにします。

そこで、慣れ親しんだように小さな JUnit 単体テストを作成し、Eclipse で を使用して実行してみCtrl+F11ます。Eclipse は、これが「Android JUnit テスト」なのか「JUnit テスト」なのかを尋ねてきます。そうですね、もちろん Android です。したがって、最初のオプションを選択して取得します。

[2013-03-23 21:37:10 - mylib] ------------------------------
[2013-03-23 21:37:10 - mylib] Android Launch!
[2013-03-23 21:37:10 - mylib] adb is running normally.
[2013-03-23 21:37:10 - mylib] Could not find mylib.apk!

うーん...それはあまり成功しませんでした。そのため、実行構成を削除して、「JUnit Test」だけを試します。今度は別のダイアログが表示され、「Android JUnit Test Launcher」または「Eclipse JUnit Test Launcher」のいずれかの優先ランチャーを選択するよう求められます。どちらを選んでも構いません。私は得る:

Class not found com.example.MyUnitTest
java.lang.ClassNotFoundException: com.example.MyUnitTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

android-maven-plugin を使用すると、Android jar のクラスを使用するだけで API 呼び出しを行わない場合、Eclipse でローカルに単体テストを実行できることを読みました。これがここで行っていることです。では、どうやってそれをやってのけるのですか?

4

3 に答える 3

3

Android Test ProjectRun As - Android JUnit Testを実行するためだけに使用しないでください。

を使用する場合Run As - JUnit TestClassNotFoundExceptionプロジェクトの出力フォルダーに関して、ADT と Eclipse の組み込み JUnit テスト ランナーの間の不一致が原因です。ADT は の下bin/classesにすべての .class ファイルを生成しますが、組み込みの JUnit テスト ランナーは の下にある .class ファイルを探しますtarget/classes。Eclipse の Android プロジェクトは決して使用しないため、空のままです。これが例外target/classesを受け取る理由です。ClassNotFoundException

私の知る限り、Eclipse組み込みのJUnitテストランナーを変更して、デフォルトのターゲット/クラスとは異なるフォルダーを使用する方法はありません。 組み込みの JUnit テスト ランナーのクラスパスに追加する方法については、Ricardo の回答をご覧ください。bin/classes../bin/classesまた、ADT ビルド プロセスが中断されるため、Android プロジェクトの既定の出力フォルダーをいずれか以外のフォルダーに変更することはできません。

(ClassNotFoundException を解決するための) 汚い回避策は、以下のすべてを手動でコピーするbin\classesことtarget\classesです。ソース コードを変更するたびに、これを行う必要があることに注意してください。

これはmvn test、コマンド ラインまたは Eclipse 経由で実行する場合には問題になりません。Maven が使用target\classesし、正しく入力する方法を知っているからです。このアプローチを使用すると、Eclipse 内で素敵な赤/緑のエラー バーがある JUnit ウィンドウを使用できなくなることに注意してください。

于 2013-03-27T00:54:50.953 に答える
0

Android Maven プラグイン サンプル プロジェクト (例: モールスフラッシュの例) のセットアップとして、Android junit テストは別のモジュールに配置する必要があります。これは、過負荷のパス設定と、テストを実行するために apk をビルドしてデバイス/エミュレーターに展開する必要があるためです。Android junit テストは単体テストではなく、統合テスト (またはこの場合はインストルメンテーション テストと呼ばれます) です。

于 2013-03-26T23:31:36.790 に答える