2013-03-22 5 views
3

Работа с Robolectric, я очень новичок в android. Я сделал первый тестовый класс, используя Activity. Он работал красиво. Теперь я хочу сделать тест для фрагмента.java.lang.IllegalStateException: Активность была разрушена

@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

Заранее спасибо !!

+0

гул, не уничтожайте свою активность до совершения транзакции фрагмента? – njzk2

ответ

1

Фрагменты должны отображаться в действии. Поток должен быть:

  • выделить новый объект фрагмента в FragmentActivity класса
  • получить менеджер фрагмента, чтобы добавить только выделенный фрагмент

В вашем случае, если вы не имеете подключения к реальная деятельность. Вы выделяете FragmentActivity с помощью нового FragmentActivity() и пытаетесь получить менеджер поддержки. Хотя в этом компиле нет «реального» действия, способного управлять вашим фрагментом. Фрагменты можно добавить к уже показанным действиям, и здесь это не так.

Я рекомендую читать эту страницу, как это объясняет эти вещи очень хорошо: http://developer.android.com/guide/components/fragments.html

+0

Спасибо! Мне удалось связать активность с фрагментом. –

+0

Что означает «реальная» активность в контексте Robolectric? –

+0

@ 백명석 Что вы сделали, чтобы связать фрагмент с активностью? Я испытываю подобную проблему. – muneikh

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(); 
4

В моем случае, в частности, моя проблема заключалась в создании этой деятельности. я использовал

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

И это должно быть

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

Надеется, что это помогает кто-то: D

1

Это случился со мной, когда я использовал fragmentTransaction.commitAllowingStateLoss(); из субфрагмента, у родительского фрагмента которого установлено значениеRetainInstance (true); У меня была деятельность как собственность, которая приводила к утечке активности при ротации.

 Смежные вопросы

  • Нет связанных вопросов^_^