5

私のセットアップ:

  1. ライブラリプロジェクト:ActionBarSherlock
  2. 計画
  3. テストプロジェクト

私のプロジェクトには、ライブラリプロジェクトがライブラリプロジェクトとしてリンクされています。コンパイルして正常に実行されます。

ここで、通常のテストプロジェクトを使用してアプリケーションをテストしようとしています。Eclipseでテストを実行すると完璧に機能します。antを使用してテストを実行しようとすると、テストプロジェクトはコンパイルされません。

[javac] LoginActivityTest.java:9: cannot access com.actionbarsherlock.app.SherlockActivity
[javac] class file for com.actionbarsherlock.app.SherlockActivity not found
[javac] public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
[javac]                                                                        ^
[javac] LoginActivityTest.java:25: cannot find symbol

Eclipseによる構築は完璧に機能し、テストも完璧に実行されます。

ライブラリプロジェクトをテストプロジェクトにリンクすると、antでコンパイルされますが、テストは失敗します。

 [exec] Error in testSuiteConstructionFailed:
 [exec] java.lang.RuntimeException: Exception during suite construction
 [exec]     at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238)
 [exec]     at java.lang.reflect.Method.invokeNative(Native Method)
 [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
 [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
 [exec]     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
 [exec]     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
 [exec] Caused by: java.lang.reflect.InvocationTargetException
 [exec]     at java.lang.reflect.Constructor.constructNative(Native Method)
 [exec]     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
 [exec]     at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87)
 [exec]     at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73)
 [exec]     at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262)
 [exec]     at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184)
 [exec]     at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371)
 [exec]     at com.zutubi.android.junitreport.JUnitReportTestRunner.onCreate(JUnitReportTestRunner.java:90)
 [exec]     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3891)
 [exec]     at android.app.ActivityThread.access$1300(ActivityThread.java:122)
 [exec]     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184)
 [exec]     at android.os.Handler.dispatchMessage(Handler.java:99)
 [exec]     at android.os.Looper.loop(Looper.java:137)
 [exec]     at android.app.ActivityThread.main(ActivityThread.java:4340)
 [exec]     at java.lang.reflect.Method.invokeNative(Native Method)
 [exec]     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 [exec]     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 [exec]     at dalvik.system.NativeStart.main(Native Method)
 [exec] Caused by: java.lang.NoClassDefFoundError: com.myproject.android.app.activities.LoginActivity
 [exec]     at com.myproject.android.app.test.LoginActivityTest.<init>(LoginActivityTest.java:18)
 [exec]     ... 19 more

私のテストクラス:

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {

    private LoginActivity mActivity;

    private EditText      mTextUserName;

    private EditText      mTextUserPassword;

    public LoginActivityTest() {
        // the super call is line 18 (see stack trace above)
        super("com.myproject.android.app.activities", LoginActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mActivity = getActivity();
        mTextUserName = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_username);
        mTextUserPassword = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_password);
    }

    public void testPreConditions() {
        assertTrue("Activity is null!", mActivity != null);
    }

    public void testLogin() throws Throwable {
        mActivity.runOnUiThread(new Runnable() {
            public void run() {
                mTextUserName.setText("username");
                mTextUserPassword.setText("password");
            }
        });
        sendKeys(KeyEvent.KEYCODE_ENTER);
    }
}

これを修正する方法はありますか?

更新:antのビルド/テストはまだ混乱しているようです。ライブラリプロジェクトのテストに関するこのブログエントリによると、リストされている7つの問題のほとんどは、次のADTリリース(ADT r20)で修正される予定です。

4

1 に答える 1

7

ADT 17がすべてを壊した/修正して以来、プロジェクトの使用に関してさまざまな情報が浮かんでいLibraryます(現在、机に頭をぶつけているかどうかによって異なります)。

まず、Androidチームが定めた名詞Libraryである「library」との違いに注意してください。プロジェクトを使用するプロジェクトを説明するプロジェクトも使用していLibraryます。ReferencingLibrary

つまり、Referencingプロジェクトはプロジェクトを使用しLibraryます。

Library「ライブラリ」以外のプロジェクト

通常のJava開発では、一方が他方のソースに依存しているEclipseでプロジェクトをリンクすることが可能です。このアプローチには、参照プロジェクトのソースとしてライブラリプロジェクトのソースを使用する効果があると思います。これは、参照プロジェクトのコンパイル中にライブラリプロジェクトのソースがスコープ内にあることを意味します。ライブラリプロジェクトクラスは、参照プロジェクトのクラスと同時に構築されます。

ほとんどの状況で使用するためにビルドする場合、すべてのクラスがビルドされてからJARやWARなどにパッケージ化されるため、これは完全に機能します。

図書館プロジェクト

ライブラリプロジェクトへの競合する(ミックスアンドマッチではない)アプローチは、AndroidチームLibraryプロジェクトです。

プロジェクトとしてマークされたAndroidプロジェクトは、そのLibraryソースをコンパイルしてjar、そのディレクトリ内のファイルにビルドしますbin(clean / buildコマンドの後)。Referencingこれを自動的にインポートしjar、プロジェクト機能にアクセスできるLibraryプロジェクト。Android Dependenciesこの関係は、パッケージエクスプローラーのJavaライブラリーの内部を見るとわかります。

クラスの依存関係の解決に加えて、リソースも直接参照され、 projectsディレクトリR.java内のファイルにコンパイルされます。Referencinggen

プロジェクトADTによって参照されたjarを含めるための「サポート」が追加されたため、セットアップされた人々に新たに導入された問題:Library

ADT17以前

プロジェクトのLibraryビルドパスにjarが追加されました。Referencingプロジェクトでは、jarを独自のビルドパスに追加することもできます。

ADT17以降

依存関係への対処

ADT 17の後Library、独自のjarを動的に参照するプロジェクトが奇妙な動作を開始しました。Referencing両方のスコープでjarを表示し続けるために、プロジェクトに同じ依存参照を含めるだけの場合ではありませんでした。これにより、含まれるクラスが奇妙に重複するようになりました。

残念ながら、ライブラリをReferencingorLibraryプロジェクトから削除するだけで(リンクが1つしか存在しなかったため)、日食が混乱し、それを使用しているプロジェクトのスコープからjarを見ることができなくなりました。

これを修正するには、Libraryプロジェクトjarを/libsディレクトリに配置する必要があります。jarがハードドライブの分散した場所にある場合、これは後部で苦痛になる可能性があります。Libraryこれらのjarは、プロジェクトで自動的に使用されますReferencing

したがって、ADT 17を通過するには:

  • 現在のプロジェクトスコープでソースとして使用されていないjarファイルをすべて削除します(これがあなたのプロジェクトであるLibraryReferencingプロジェクトであるかは関係ありません)。
  • プロジェクトから「ライブラリ」プロジェクトを削除しませんLibrary(代わりに、それらをjarにコンパイルします)。
  • プロジェクトから外部jarを削除し、代わりにディレクトリにLibraryコピーします。libs
于 2012-04-25T11:19:14.337 に答える