我的Android应用程序基于“单一 Activity ”,基于多个 fragment 的模型构建。
我需要对该应用程序进行单元测试。我可以使用ActivityInstrumentationTestCase2 JUnit为包含所有 Activity 的应用程序编写单元测试用例,但不能为包含 fragment 的应用程序编写单元测试用例。
请提出为 fragment 编写JUnit测试用例的方法。
谢谢
最佳答案
参见 Android: Testing fragments
如果要单独测试 fragment ,则需要创建一个Test FragmentActivity,以便测试可以使用它。测试 Activity 将如下所示。请记住在您的应用程序 list 中声明它:
public class TestFragmentActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_fortests);
}
}
布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/activity_test_fragment_linearlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>
AndroidManifest:
...
<activity
android:name="your.package.name.TestFragmentActivity"
android:exported="false" />
...
然后在测试项目中,您可以拥有一个类似这样的类来启动 fragment :
public class FrameworkObjectsGeneratorFragmentTest
extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
private TestFragmentActivity mActivity;
public FrameworkObjectsGeneratorFragmentTest() {
super(TestFragmentActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
}
private Fragment startFragment(Fragment fragment) {
FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
transaction.add(R.id.activity_test_fragment_linearlayout, fragment, "tag");
transaction.commit();
getInstrumentation().waitForIdleSync();
Fragment frag = mActivity.getFragmentManager().findFragmentByTag("tag");
return frag;
}
public void testFragment() {
FrameworkObjectsGeneratorFragment fragment = new FrameworkObjectsGeneratorFragment() {
//Override methods and add assertations here.
};
Fragment frag = startFragment(fragment);
}
}
startFragment()方法将您指定的 fragment 添加到TestActivity中的ViewGroup。
与“Activity ”相比,测试 fragment 的好处是,您可以扩展“fragment ”以覆盖可以在其中添加断言的 protected 字段和方法。
注意:如果使用支持库,请调用getSupportFragmentManager()。