我正在使用自定义FragmentTestRule和Espresso来隔离测试我的每个碎片.
我有一个专门的TestActivity,在我的应用程序中显示测试的碎片.在我的情况下,Activity仅存在于调试变体中,因为我的检测测试针对debug运行.
1.在src / debug / java / your / package / TestActivity.java中创建一个TestActivity,其中包含一个内容视图,其中将测试的片段添加到:
@VisibleForTesting
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setId(R.id.container);
setContentView(frameLayout);
}
}
2.为调试变量创建AndroidManifest.xml并声明TestActivity.这是测试时启动TestActivity所必需的.将此Manifest添加到src / debug / AndroidManifest.xml中的调试变量中:
3.在src / androidTest / java / your / test / package / FragmentTestRule.java中的androidTest变体中创建FragmentTestRule:
public class FragmentTestRule extends ActivityTestRule {
private final Class mFragmentClass;
private F mFragment;
public FragmentTestRule(final Class fragmentClass) {
super(TestActivity.class, true, false);
mFragmentClass = fragmentClass;
}
@Override
protected void afterActivityLaunched() {
super.afterActivityLaunched();
getActivity().runOnUiThread(() -> {
try {
//Instantiate and insert the fragment into the container layout
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
mFragment = mFragmentClass.newInstance();
transaction.replace(R.id.container, mFragment);
transaction.commit();
} catch (InstantiationException | IllegalAccessException e) {
Assert.fail(String.format("%s: Could not insert %s into TestActivity: %s",
getClass().getSimpleName(),
mFragmentClass.getSimpleName(),
e.getMessage()));
}
});
}
public F getFragment(){
return mFragment;
}
}
4.然后你可以单独测试片段:
public class MyFragmentTest {
@Rule
public FragmentTestRule mFragmentTestRule = new FragmentTestRule<>(MyFragment.class);
@Test
public void fragment_can_be_instantiated() {
// Launch the activity to make the fragment visible
mFragmentTestRule.launchActivity(null);
// Then use Espresso to test the Fragment
onView(withId(R.id.an_id_in_the_fragment)).check(matches(isDisplayed()));
}
}