2013-03-22 144 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()); 
    } 
} 

這是我第一個Fragment類的測試類。它拋出

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

任何人都知道如何解決這個問題?

您可以事先從https://github.com/msbaek/frame-test

由於發現整個源代碼!

+0

哼,不要在提交碎片事務之前破壞你的活動? – njzk2 2013-03-22 10:31:51

回答

1

這些片段應該從活動中顯示。該流程應該是:

  • 在FragmentActivity類
  • 分配一個新片段對象獲取的片段管理者增加新分配的片段

在你的情況,你就不必一個一個連接真正的活動。您使用新的FragmentActivity()分配FragmentActivity並嘗試獲取支持管理器。雖然這個編譯沒有「真正的」活動能夠管理你的片段。片段可以添加到已經顯示的活動上,但事實並非如此。

我建議你閱讀這個頁面,因爲它解釋了這些事情非常好:http://developer.android.com/guide/components/fragments.html

+0

謝謝!我成功地將活動連接到片段。 – 2013-03-22 13:53:40

+0

Robolectric中的「真實」活動意味着什麼? – 2013-05-28 14:41:18

+0

@백명석你是如何將片段連接到活動的?我遇到了類似的問題。 – muneikh 2015-04-20 01:06:40

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

這是工作的版本。以下三行很重要(它來自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();來自其片段具有setRetainInstance(true)的子片段;我的活動屬於導致旋轉活動泄露的屬性。

相關問題