使用Robolectric,我对android很新。我使用Activity制作了第一个测试类。它工作得很好。 现在我想对片段进行测试。
@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());
}
}
这是我第一个Fragment类的测试类。它抛出
"java.lang.IllegalStateException: Activity has been destroyed" in startFragment#fragmentTransaction.commit().
任何人都知道如何解决这个问题?
您可以从https://github.com/msbaek/frame-test
找到完整的来源提前致谢!!
答案 0 :(得分:4)
就我而言,具体来说,我的问题是在创建活动时。 我正在使用
activity = Robolectric.buildActivity(MyActivity.class).get();
它应该是
activity = Robolectric.buildActivity(MyActivity.class).create().get();
希望它有助于某人:D
答案 1 :(得分:3)
@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 source - DialogFragmentTest)。
shadowOf(activity).callOnCreate(null);
shadowOf(activity).callOnStart();
shadowOf(activity).callOnResume();
答案 2 :(得分:1)
应该从活动中显示片段。流程应该是:
在您的情况下,您没有与真实活动的连接。您使用新的FragmentActivity()分配FragmentActivity并尝试获取支持管理器。虽然这可以编译,但没有“真正的”活动能够管理您的片段。可以在已经显示的活动上添加碎片,但事实并非如此。
我建议您阅读此页面,因为它可以很好地解释这些内容:http://developer.android.com/guide/components/fragments.html
答案 3 :(得分:1)
当我使用fragmentTransaction.commitAllowingStateLoss()时,发生了这种情况。来自子片段,其父片段具有setRetainInstance(true);我有活动作为财产导致轮换活动泄漏。