测试错误:MyActivity已经设置内容。如果您已使用 ComposeView 填充 Activity,请确保在该 ComposeView 上调用 setContent

Seb*_* LG 13 android android-testing android-jetpack-compose

使用最新版本的 Compose 1.2.0 运行 Robolectric 单元测试时,测试createAndroidComposeRule失败并出现以下错误:

MyActivity 已经设置了内容。如果您已使用 ComposeView 填充 Activity,请确保在该 ComposeView 上调用 setContent,而不是在测试规则上调用;并确保setContent {}在 ComposeTestRule 运行后完成调用

来自失败测试之一的代码:

composeTestRule.setContent {
    Column {
        Text(textTitle)
        DemoScopedInjectedViewModelComposable()
    }
}
Run Code Online (Sandbox Code Playgroud)

cor*_*her 27

仔细观察,错误消息有很大帮助,即使它谈论的是 aComposeView而不是Activity。但根据它:

composeTestRule.setContent { ... }
Run Code Online (Sandbox Code Playgroud)

应改为:

composeTestRule.activity.setContent { ... }
Run Code Online (Sandbox Code Playgroud)

并且测试应该运行而不会再出现此错误。


The*_*3t0 7

1.2 Compose禁止覆盖活动规则的内容。但这仍然可以通过直接在活动上设置内容来完成,而不是活动测试规则。

解决此问题的最简单方法是不在活动规则上设置内容,而是在活动本身上设置内容。可以这样做:

composeTestRule.activity.runOnUiThread {
    composeTestRule.activity.setContent {
        Column {
            Text(textTitle)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了简化使用,您可以使用以下扩展

fun <R : TestRule, A : ComponentActivity> AndroidComposeTestRule<R, A>.setContentOnActivity(
    content: @Composable () -> Unit
) {
    this.activity.runOnUiThread {
        this.activity.setContent {
            content()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)