与Robolectric工作,我很新到Android。 我使用活动由第一测试类。 它的工作很好。 现在,我想做出片段的测试。
@RunWith(RobolectricTestRunner.class)
public class LoginFragmentTest {
private LoginFragment fragment;
@Before
public void setup() {
fragment = new LoginFragment();
startFragment(fragment);
assertThat(fragment, notNullValue());
assertThat(fragment.getActivity(), notNullValue());
}
private void startFragment(LoginFragment fragment) {
FragmentManager fragmentManager = new FragmentActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(fragment, null);
fragmentTransaction.commit();
}
@Test
public void login() {
EditText idEditText = (EditText)fragment.getActivity().findViewById(R.id.main_id);
assertThat(idEditText, notNullValue());
}
}
这是片段级我的第一个测试类。 它抛出
"java.lang.IllegalStateException: Activity has been destroyed" in startFragment#fragmentTransaction.commit().
任何人都知道如何解决这个问题?
你可以找到从整个源代码https://github.com/msbaek/frame-test
提前致谢 !!
所述片段被假定从一个活动显示。 该流程应该是:
- 在一个FragmentActivity类分配一个新对象的片段
- 获得片段管理者增加新分配的片段
在你的情况,你没有一个真正的活动的连接。 您分配了新FragmentActivity(一FragmentActivity),并尝试以获得支持经理。 虽然这编译没有“真正”的活动能够管理你的片段。 片段可以在已经显示的活动被添加在这里它并非如此。
我建议阅读这个页面,因为它解释了这些事情非常好: http://developer.android.com/guide/components/fragments.html
在我的情况下,特别是,在创建活动时,我的问题是。 我用
activity = Robolectric.buildActivity(MyActivity.class).get();
它应该是
activity = Robolectric.buildActivity(MyActivity.class).create().get();
希望它可以帮助别人:d
@RunWith(RobolectricTestRunner.class)
public class LoginFragmentTest {
private LoginFragment fragment;
@Before
public void setup() {
fragment = new LoginFragment();
startFragment();
assertThat(fragment, notNullValue());
assertThat(fragment.getActivity(), notNullValue());
}
private void startFragment() {
FragmentActivity activity = new FragmentActivity();
shadowOf(activity).callOnCreate(null);
shadowOf(activity).callOnStart();
shadowOf(activity).callOnResume();
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(fragment, null);
fragmentTransaction.commit();
}
@Test
public void login() {
EditText idEditText = (EditText) fragment.getView().findViewById(R.id.main_id);
assertThat(idEditText, notNullValue());
}
}
这是工作的版本。 下面3条线是重要的(这是从robolectric源 - DialogFragmentTest)。
shadowOf(activity).callOnCreate(null);
shadowOf(activity).callOnStart();
shadowOf(activity).callOnResume();
这事对我来说,当我用fragmentTransaction.commitAllowingStateLoss(); 从子片段的父片段具有setRetainInstance(真); 我有活动财产是什么导致对旋转泄漏的活动。