最近リリースされた 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);
}
}