3

Robolectric を使用して、私はアンドロイドに非常に慣れていません。アクティビティを使用して最初のテスト クラスを作成しました。それはうまくいきました。次に、フラグメントのテストを行います。

@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からソース全体を見つけることができます

前もって感謝します !!

4

4 に答える 4

4

私の場合、具体的には、アクティビティを作成するときに問題がありました。使っていました

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

そして、それはあるべきです

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

それが誰かを助けることを願っています:D

于 2013-06-24T17:47:50.337 に答える
1

フラグメントはアクティビティから表示されるはずです。フローは次のようになります。

  • FragmentActivity クラスに新しいフラグメント オブジェクトを割り当てる
  • 新しく割り当てられたフラグメントを追加するフラグメント マネージャーを取得します。

あなたの場合、実際の活動とは関係ありません。FragmentActivity を new 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 に答える