我运行特定的单元测试:
@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代码被调用了(一个断点变成了两个断点)
我得到这个运行时错误:
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怎么办?仅针对此特定测试失败
有什么想法吗?
答案 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