Android &引用;“活动已被销毁”;机器人分子测试中的错误

Android &引用;“活动已被销毁”;机器人分子测试中的错误,android,android-fragments,robolectric,Android,Android Fragments,Robolectric,我正试图用Robolectric在Android上进行Fragment测试,我知道还有一些帖子是关于FragmentActivity的问题的,因为它没有存储在某个变量中 然而,我正在努力工作,您可以看到在本例中,FragmentActivity对象引用被保留,因此应该不会有问题。下面是基类: import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import org.jun

我正试图用
Robolectric
在Android上进行
Fragment
测试,我知道还有一些帖子是关于
FragmentActivity
的问题的,因为它没有存储在某个变量中

然而,我正在努力工作,您可以看到在本例中,
FragmentActivity
对象引用被保留,因此应该不会有问题。下面是基类:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;

import org.junit.After;
import org.robolectric.Robolectric;
import org.robolectric.util.ActivityController;

public class FragmentTestCase<T extends Fragment> {

private static final String FRAGMENT_TAG = "fragment";

private ActivityController controller;
private FragmentActivity activity;
private T fragment;

public void startFragment(T fragment) {
    this.fragment = fragment;
    controller = Robolectric.buildActivity(FragmentActivity.class);
    activity = (FragmentActivity) controller.create().start().visible().get();
    activity.getSupportFragmentManager()
            .beginTransaction()
            .add(fragment, FRAGMENT_TAG).commit();
}

@After
public void destroyFragment() {
    if (fragment != null) {
        activity.getSupportFragmentManager()
                .beginTransaction()
                .remove(fragment)
                .commit();

        fragment = null;
    }
}

public void pauseAndResumeFragment() {
    controller.pause().resume();
}

public T recreateFragment() {
    activity.recreate();
    fragment = (T) activity.getSupportFragmentManager()
            .findFragmentByTag(FRAGMENT_TAG);

    return fragment;
 }
}

似乎在某种程度上,活动在进入
destroyFragment
方法之前被销毁,但我找不到原因。如果您能提供任何帮助,我们将不胜感激。

当您调用activity.recreate()时,您实际上会破坏当前的活动,并且您保留的引用将无效。然后,您尝试使用已销毁活动的FragmentManager,它会崩溃。

当您调用activity.recreate()时,您实际上销毁了当前活动,并且保留的引用变得无效。然后,您尝试使用已销毁活动的FragmentManager,它将崩溃。

谢谢!这似乎解决了错误。尽管我不明白为什么在activity.recreate()之后,错误日志指向commit方法的第36行在同一个活动上有一个对FragmentManager的调用,没有显示任何错误。如果保留对已销毁活动的引用,您仍然可以访问该活动的FragmentManager的数据,但是尝试提交任何FragmentTransaction将失败。谢谢!这似乎解决了错误。尽管我不明白为什么在activity.recreate()之后,错误日志指向commit方法的第36行在同一个活动上有一个对FragmentManager的调用,没有显示任何错误。如果保留对已销毁活动的引用,您仍然可以访问该活动的FragmentManager的数据,但是尝试提交任何FragmentTransaction将失败。
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;

import static org.assertj.core.api.Assertions.*;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants=BuildConfig.class, sdk=21)
public class MainActivityFragmentTest extends FragmentTestCase<MainActivityFragment> {

private MainActivityFragment fragment;

@Before
public void setUp() throws Exception {
    fragment = new MainActivityFragment();
}

@Test
public void createsAndDestroysFragment() throws Exception {
    startFragment(fragment);
    assertThat(fragment).isNotNull();
}

@Test
public void pausesAndResumesFragment() throws Exception {
    startFragment(fragment);
    pauseAndResumeFragment();
    assertThat(fragment).isNotNull();
}

@Test
public void recreatesFragment() throws Exception {
    startFragment(fragment);
    fragment = recreateFragment();
    assertThat(fragment).isNotNull();
  }
 }
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1399)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616)
at com.feyserflabs.musync.FragmentTestCase.destroyFragment(FragmentTestCase.java:36)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:245)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:185)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:149)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)