web-dev-qa-db-ja.com

FragmentActivityは、ActivityInstrumentationTestCase2を介してテストすることはできません

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

私が抱えている問題は、フラグメントを利用する(そして3.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);
    }
}
28
securelpb

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

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

IntelliJ Project Structure

4
colabug

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

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

3
Rupert Bates