robolectric / robolectric

Android Unit Testing Framework
http://robolectric.org
Other
5.9k stars 1.37k forks source link

android.view.InflateException: XML file #-1 (sorry, not yet implemented): FragmentManager is already executing transactions #4199

Closed luongvo closed 5 years ago

luongvo commented 5 years ago

Description

Robolectric can not inflate fragment inside viewpager. It can be inflated if the layout just contains only androidx.recyclerview.widget.RecyclerView as root view 🤔

android.view.InflateException: XML file /Users/luongvo/WORKS/android/_libs/robolectric.shadows-supportv4/app/build/intermediates/merged-not-compiled-resources/debug/layout/fragment_aaa.xml line #-1 (sorry, not yet implemented): FragmentManager is already executing transactions

Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
    at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
    at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2239)
    at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
    at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
    at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
    at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
    at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
    at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
    at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
    at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
    at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
    at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
    at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
    at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:27)
    at android.view.ViewGroup.addView(ViewGroup.java)
    at android.view.ViewGroup.addView(ViewGroup.java:4837)
    at androidx.appcompat.widget.Toolbar.addSystemView(Toolbar.java:1405)
    at androidx.appcompat.widget.Toolbar.ensureMenuView(Toolbar.java:1054)
    at androidx.appcompat.widget.Toolbar.setMenu(Toolbar.java:551)
    at androidx.appcompat.widget.ToolbarWidgetWrapper.setMenu(ToolbarWidgetWrapper.java:370)
    at androidx.appcompat.widget.ActionBarOverlayLayout.setMenu(ActionBarOverlayLayout.java:721)
    at androidx.appcompat.app.AppCompatDelegateImpl.preparePanel(AppCompatDelegateImpl.java:1583)
    at androidx.appcompat.app.AppCompatDelegateImpl.doInvalidatePanelMenu(AppCompatDelegateImpl.java:1869)
    at androidx.appcompat.app.AppCompatDelegateImpl$2.run(AppCompatDelegateImpl.java:230)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
    at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
    at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
    at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
    at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
    at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
    at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
    at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
    at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
    at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:27)
    at android.view.ViewGroup.addView(ViewGroup.java)
    at android.view.ViewGroup.addView(ViewGroup.java:4837)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at co.nimblehq.robolectric.shadows.supportv4.AAAFragment.onCreateView(AAAFragment.kt:12)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
    at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
    at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
    at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
    at android.view.View.measure(View.java:23169)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
    at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
    at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
    at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
    at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
    at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
    at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
    at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
    at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
    at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
    at org.robolectric.android.controller.ActivityController.visible(ActivityController.java:119)
    at co.nimblehq.robolectric.shadows.supportv4.AAATest.setup(AAATest.kt:25)
    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.RunBefores.evaluate(RunBefores.java:24)
    at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:260)
    at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:130)
    at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:42)
    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.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:84)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Steps to Reproduce

AAATest.kt

@RunWith(RobolectricTestRunner::class)
class AAATest {

    private lateinit var fragment: AAAFragment

    @Before
    fun setup() {
        val intent = Intent()
        val activityController = Robolectric.buildActivity(MainActivity::class.java, intent)
            .create()
            .start()
            .resume()
            .visible()
        val activity = activityController.get()
        activity.viewPagerHotelInfo.currentItem = 0
        val adapter = activity.viewPagerHotelInfo.adapter as SmartFragmentStatePagerAdapter
        fragment = adapter.getRegisteredFragment(0) as AAAFragment
        fragment.shouldNotBeNull()
    }

    @Test
    fun `When click at the gallery, it opens full screen image with correct extras`() {
        fragment.shouldNotBeNull()
    }

}

AAAFragment.kt

class AAAFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_aaa, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    companion object {

        @JvmStatic
        fun newInstance(): AAAFragment = AAAFragment()

    }
}

fragment_aaa.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/gridViewGallery"
        app:spanCount="3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        android:gravity="center"
        android:padding="10dp"
        android:scrollbarStyle="outsideOverlay"
        android:scrollbars="vertical" />

</FrameLayout>

Robolectric & Android Version

Robolectric: 4.1-SNAPSHOT Android: 28

luongvo commented 5 years ago

This bug is duplicated to https://github.com/robolectric/robolectric/issues/3698#issuecomment-433470017