robolectric引发FragmentManager已经在执行事务

时间:2019-04-14 20:15:03

标签: android unit-testing fragment robolectric

我运行特定的单元测试:

      @Rule
      public ActivityScenarioRule<FragmentUtilActivity> activityScenarioRule2 =
          new ActivityScenarioRule<>(FragmentUtilActivity.class);

      @Before
      public void setUp() {
... //not related to activityScenarioRule2
      }

      @Test
      @Config(qualifiers = "sw600dp")
      public void myTest() {

        activityScenarioRule2
            .getScenario()
            .onActivity(
                activity ->
                    standaloneAccountMenuDialogFragment.showNow(
                        activity.getSupportFragmentManager(), "FragmentTag"));

        assertThat(...);
      }

我看到@after代码被调用了(一个断点变成了两个断点)

image.png

我得到这个运行时错误:

FragmentManager is already executing transactions
java.lang.IllegalStateException: 
    at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManagerImpl.java:1551)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1611)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManagerImpl.java:137)
    at android.os.Handler.handleCallback(Handler.java:790)

如果我使用一次定义并由@Rule注释管理的activityScenario怎么办?仅针对此特定测试失败

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我已经在Robolectric和ActivityScenario中看到了此问题,这似乎是一种竞争条件,在我们到达该片段时,该片段尚未附加。默认(LEGACY)LooperMode中对此有警告,如果未指定模式,则使用该警告。有关详细信息,请参见javadoc here

尝试将@LooperMode(LooperMode.Mode.PAUSED)添加到测试类的顶部,这对Looper行为有一些改进。您可能还需要在teardown方法中添加shadowOf(getMainLooper())。idle()调用。

如果这没有帮助,另一个解决方法是将sdk = [27]添加到测试类顶部的配置中,如下所示: @Config(sdk = [27])

有关此问题的更多详细信息-https://github.com/robolectric/robolectric/issues/3698