3

与 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());
    }
}

这是我的第一个片段类测试类。它抛出

"java.lang.IllegalStateException: Activity has been destroyed" in startFragment#fragmentTransaction.commit().

任何人都知道如何解决这个问题?

您可以从https://github.com/msbaek/frame-test找到整个源代码

提前致谢 !!

4

4 回答 4

4

就我而言,具体来说,我的问题是在创建活动时。我正在使用

 activity = Robolectric.buildActivity(MyActivity.class).get();

它应该是

 activity = Robolectric.buildActivity(MyActivity.class).create().get();

希望它可以帮助某人:D

于 2013-06-24T17:47:50.337 回答
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 源 - DialogFragmentTest)。

        shadowOf(activity).callOnCreate(null);
        shadowOf(activity).callOnStart();
        shadowOf(activity).callOnResume();
于 2013-04-02T07:33:25.303 回答
1

片段应该从活动中显示。流程应该是:

  • 在 FragmentActivity 类中分配一个新的片段对象
  • 让片段管理器添加新分配的片段

在您的情况下,您与实际活动没有联系。您使用 new FragmentActivity() 分配一个 FragmentActivity 并尝试获得支持经理。虽然这个编译没有“真正的”活动能够管理你的片段。可以在已经显示的活动上添加片段,但情况并非如此。

我建议阅读此页面,因为它很好地解释了这些事情:http: //developer.android.com/guide/components/fragments.html

于 2013-03-22T10:52:12.763 回答
1

当我使用 fragmentTransaction.commitAllowingStateLoss(); 时,这发生在我身上。来自其父片段具有 setRetainInstance(true) 的子片段;我将活动作为财产,导致轮换活动泄漏。

于 2013-08-09T16:19:37.090 回答