如何测试使用 ActivityResult API 的 Activity?

问题描述

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