28

最近リリースされた Fragment サポート API を利用する Android アプリケーションに対して Android 単体テストを実行する際に問題があります。FragmentActivity に対してテストを実行すると、次のエラーがログに表示され、クラスの読み込みに失敗します。同一のクラスに対して実行されますが、Activity から派生したクラスに対して実行すると、テストは正常に機能します。どちらのクラスもアプリとして正しく動作します! つまり、単純に呼び出されると、レイアウトと機能の両方が正しく表示されます。サポート jar はビルド パスの一部であり、プロジェクトに含まれています。

私が抱えている問題は、フラグメントを利用する (および pre3.0 android をサポートする) 唯一の方法は FragmentActivity を利用することですが、それが自動テストを除外する場合、このライブラリは何が良いかということです。

4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440
04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification)
04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49)
04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed
04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init>
04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest;

問題を示すために作成したコードを次に示します。テスト ケースは、テスト対象のクラスをインスタンス化しようとするだけです。

FrameLayoutTest.java    
public class FrameLayoutTest extends
            ActivityInstrumentationTestCase2<FragmentLayoutSupport> {
        public FrameLayoutTest() {
            super(FragmentLayoutSupport.class);
        }

    public void testActivityTestCaseSetUpProperly() {
        assertNotNull("activity should be launched successfully", getActivity());
    }
}

私が作成した 2 つのクラスは次のとおりで、fragment_layout は空の LinearLayout です。

FrameLayout.java
public class FragmentLayout extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

FragmentLayoutSupport.java
public class FragmentLayoutSupport extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}
4

3 に答える 3

50

私はこれに半夜を費やし、最終的に解決策を見つけました。キーラインは次のとおりです。

04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 

問題は、テスト プロジェクトで使用している android-support-v4.jar がアプリケーション プロジェクトのものと異なることです。テスト プロジェクトから android-support-v4.jar への参照をすべて削除します。次に、アプリケーション プロジェクトの [Properties] -> [Java Build Path] -> [Order and Export] に移動し、android-support-v4.jar をチェックしてエクスポートします。これで、両方のプロジェクトが同じライブラリを使用するようになり、dalvik は文句を言いません。

于 2011-04-13T06:32:03.803 に答える
4

RupertによるIntelliJの回答は、私をそこまで導きませんでした。Eclipseの回答が示唆するようにjarをエクスポートすることでこれを解決しました。

[ファイル] > [プロジェクト構造] > [モジュール] > [メイン アプリを選択] > [依存関係] タブ > サポート jar の横にある [エクスポート] チェック ボックスをクリックします。

IntelliJ プロジェクトの構造

于 2012-03-05T17:35:41.090 に答える
3

この問題に遭遇した IntelliJ ユーザーの場合、同等の修正は、次のように依存関係のスコープを「提供」に設定することです。

[ファイル] > [プロジェクト構造] > [モジュール] > [テスト アプリを選択] > [依存関係] タブ > スコープ ドロップダウンで [提供] を選択します。

于 2012-02-09T14:13:46.697 に答える