问题描述
docs 在测试 Fragment 时非常好,但没有关于如何测试使用 ActivityResult 的 Activity 的信息。
我们应该如何在 Activity 测试中覆盖 activityResultRegistry
?
解决方法
我没有像我应该阅读的那样精确地阅读文档。
注意:任何允许您在测试中注入单独的 ActivityResultRegistry
的机制都足以测试您的活动结果调用。
强调注入这个词。
我在我的项目中使用 Koin,因此我决定使用 Scopes api 创建 ActivityResultRegistry
的 Activity Scoped 实例,并将其注入到我的 registerForActivityResult
调用中。
val activityScopeModule = module {
scope<MyActivity> {
scoped { get<ComponentActivity>().activityResultRegistry }
}
}
class MyActivity: AppCompatActivity() {
private val requestPermLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission(),get<ActivityResultRegistry>() // Koin injection
) { granted ->
// handle
}
}
通过使用 DI,在测试中注入我的自定义测试实例 ActivityResultRegistry
变得非常容易。
关于该主题的有用博客文章(使用 Hilt 实现相同的任务):https://blog.stylingandroid.com/activity-result-contract-outside-the-activity/
关于 Koin Scopes API 的博文:https://proandroiddev.com/understanding-android-scopes-with-koin-cfe6b60ca579