FragmentScenario


class FragmentScenarioFragment> : Closeable

FragmentScenario provides API to start and drive a Fragment's lifecycle state for testing. It works with arbitrary fragments and works consistently across different versions of the Android framework.

FragmentScenario only supports androidx.fragment.app.Fragment. If you are using a deprecated fragment class such as android.support.v4.app.Fragment or android.app.Fragment, please update your code to androidx.fragment.app.Fragment.

If your testing Fragment has a dependency to specific theme such as Theme.AppCompat, use the theme ID parameter in launch method.

Parameters
Fragment>

The Fragment class being tested

See also
ActivityScenario

a scenario API for Activity

Summary

Nested types

fun interface FragmentScenario.FragmentActionFragment>

FragmentAction interface should be implemented by any class whose instances are intended to be executed by the main thread.

Public companion functions

FragmentScenario
Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    factory: FragmentFactory?
)

Launches a Fragment with given arguments hosted by an empty FragmentActivity using the given FragmentFactory and waits for it to reach the resumed state.

FragmentScenario
Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    factory: FragmentFactory?
)

Launches a Fragment with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach the resumed state.

FragmentScenario
Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    initialState: Lifecycle.State,
    factory: FragmentFactory?
)

Launches a Fragment with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach initialState.

FragmentScenario
Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    factory: FragmentFactory?
)

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity using the given FragmentFactory and waits for it to reach the resumed state.

FragmentScenario
Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    factory: FragmentFactory?
)

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach the resumed state.

FragmentScenario
Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    initialState: Lifecycle.State,
    factory: FragmentFactory?
)

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach initialState.

Public functions

open Unit

Finishes the managed fragments and cleans up device's state.

FragmentScenario

Moves Fragment state to a new state.

FragmentScenario

Runs a given action on the current Activity's main thread.

FragmentScenario

Recreates the host Activity.

Extension functions

inline T
Fragment, T : Any> FragmentScenario.withFragment(
    crossinline block: F.() -> T
)

Run block using FragmentScenario.onFragment, returning the result of the block.

Public companion functions

launch

Added in 1.3.0
fun Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    factory: FragmentFactory?
): FragmentScenario

Launches a Fragment with given arguments hosted by an empty FragmentActivity using the given FragmentFactory and waits for it to reach the resumed state.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle?

a bundle to passed into fragment

factory: FragmentFactory?

a fragment factory to use or null to use default factory

launch

Added in 1.3.0
fun Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    factory: FragmentFactory?
): FragmentScenario

Launches a Fragment with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach the resumed state.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle?

a bundle to passed into fragment

themeResId: @StyleRes Int

a style resource id to be set to the host activity's theme

factory: FragmentFactory?

a fragment factory to use or null to use default factory

launch

Added in 1.3.0
fun Fragment> launch(
    fragmentClass: Class,
    fragmentArgs: Bundle? = null,
    themeResId: @StyleRes Int = R.style.FragmentScenarioEmptyFragmentActivityTheme,
    initialState: Lifecycle.State = Lifecycle.State.RESUMED,
    factory: FragmentFactory? = null
): FragmentScenario

Launches a Fragment with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach initialState.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle? = null

a bundle to passed into fragment

themeResId: @StyleRes Int = R.style.FragmentScenarioEmptyFragmentActivityTheme

a style resource id to be set to the host activity's theme

initialState: Lifecycle.State = Lifecycle.State.RESUMED

The initial Lifecycle.State. Passing in DESTROYED will result in an IllegalArgumentException.

factory: FragmentFactory? = null

a fragment factory to use or null to use default factory

launchInContainer

Added in 1.3.0
fun Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    factory: FragmentFactory?
): FragmentScenario

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity using the given FragmentFactory and waits for it to reach the resumed state.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle?

a bundle to passed into fragment

factory: FragmentFactory?

a fragment factory to use or null to use default factory

launchInContainer

Added in 1.3.0
fun Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle?,
    themeResId: @StyleRes Int,
    factory: FragmentFactory?
): FragmentScenario

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach the resumed state.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle?

a bundle to passed into fragment

themeResId: @StyleRes Int

a style resource id to be set to the host activity's theme

factory: FragmentFactory?

a fragment factory to use or null to use default factory

launchInContainer

Added in 1.3.0
fun Fragment> launchInContainer(
    fragmentClass: Class,
    fragmentArgs: Bundle? = null,
    themeResId: @StyleRes Int = R.style.FragmentScenarioEmptyFragmentActivityTheme,
    initialState: Lifecycle.State = Lifecycle.State.RESUMED,
    factory: FragmentFactory? = null
): FragmentScenario

Launches a Fragment in the Activity's root view container android.R.id.content, with given arguments hosted by an empty FragmentActivity themed by themeResId, using the given FragmentFactory and waits for it to reach initialState.

This method cannot be called from the main thread.

Parameters
fragmentClass: Class

a fragment class to instantiate

fragmentArgs: Bundle? = null

a bundle to passed into fragment

themeResId: @StyleRes Int = R.style.FragmentScenarioEmptyFragmentActivityTheme

a style resource id to be set to the host activity's theme

initialState: Lifecycle.State = Lifecycle.State.RESUMED

The initial Lifecycle.State. Passing in DESTROYED will result in an IllegalArgumentException.

factory: FragmentFactory? = null

a fragment factory to use or null to use default factory

Public functions

close

Added in 1.4.0
open fun close(): Unit

Finishes the managed fragments and cleans up device's state. This method blocks execution until the host activity becomes Lifecycle.State.DESTROYED.

moveToState

Added in 1.1.0
fun moveToState(newState: Lifecycle.State): FragmentScenario

Moves Fragment state to a new state.

If a new state and current state are the same, this method does nothing. It accepts all Lifecycle.States. DESTROYED is a terminal state. You cannot move to any other state after the Fragment reaches that state.

This method cannot be called from the main thread.

onFragment

Added in 1.1.0
fun onFragment(action: FragmentScenario.FragmentAction): FragmentScenario

Runs a given action on the current Activity's main thread.

Note that you should never keep Fragment reference passed into your action because it can be recreated at anytime during state transitions.

Throwing an exception from action makes the host Activity crash. You can inspect the exception in logcat outputs.

This method cannot be called from the main thread.

recreate

Added in 1.1.0
fun recreate(): FragmentScenario

Recreates the host Activity.

After this method call, it is ensured that the Fragment state goes back to the same state as its previous state.

This method cannot be called from the main thread.

Extension functions

inline fun Fragment, T : Any> FragmentScenario.withFragment(
    crossinline block: F.() -> T
): T

Run block using FragmentScenario.onFragment, returning the result of the block.

If any exceptions are raised while running block, they are rethrown.