android - 如何在所有测试中轻松地用假货替换生产 Hilt 模块

标签 android dependency-injection dagger-hilt

我的 Android 产品代码充满了安装各种生产实现的 Hilt 模块:

@Module
@InstallIn(ApplicationComponent.class)
public abstract class TimeModule {...}
@Module
@InstallIn(ApplicationComponent.class)
public abstract class DatabaseModule {...}
在我所有的仪器测试中,我想用假货替换那些绑定(bind)。我的测试代码库包括绑定(bind)假实现的模块,但是让两个模块提供相同的类显然会导致编译时错误。
Hilt 文档建议使用 @UninstallModule() ,但这意味着我必须添加 UninstallModule对于每个测试中的每个生产模块。这似乎是错误的做法。
通常如何用假模块替换生产模块?有没有办法像 Guice 一样从另一个模块安装模块,所以我可以删除 @InstallIn从我所有的生产模块中取而代之的是一个 ProductionModule安装所有单独的模块?这将使在测试中卸载一个模块变得更容易。

最佳答案

How would one normally replace production modules with fake modules?


可能它通常是如何完成的,就像文档中所说的 UninstallModule注解。但这里有一个替代方案,我喜欢使用它,使用构建风格:
我喜欢整理我的项目,所以有mocklive口味。我的应用模块中有 3 个文件夹:src/main/kotlin包含 Activity 、 fragment 等...,src/mock/kotlin我的假绑定(bind)在哪里,最后是 src/live/kotlin我真正的生产绑定(bind)所在的位置。
这是我的 app 中的相关配置级别 build.gradle.kts :
android {
  productFlavors {
    flavorDimensions("environment")
    register("mock") {
      dimension = "environment"
    }

    register("dev") {
      dimension = "environment"
    }

    register("prod") {
      dimension = "environment"
    }

    sourceSets {
      getByName("mock").java.srcDir("src/mock/kotlin")
      getByName("dev").java.srcDir("src/live/kotlin")
      getByName("prod").java.srcDir("src/live/kotlin")
    }
  }
}

项目结构概述
Project structure overview
里面直播InteractorModule :
@Module
@InstallIn(ApplicationComponent::class)
abstract class InteractorModule {
  @Binds
  abstract fun bindTodoInteractor(interactor: TodoInteractorImpl): TodoInteractor
}
里面FakeInteractorsModule :
@Module
@InstallIn(ApplicationComponent::class)
abstract class InteractorModule {
  @Binds
  abstract fun bindTodoInteractor(interactor: TodoInteractorFake): TodoInteractor
}
因此,现在您可以使用构建变体选项卡在接口(interface)的真实实现和模拟实现之间进行切换。因此,如果您想在仪器测试中使用假货,请在运行测试时使用模拟风格。
这种方法的一个优点是,通过更改构建变体,您可以在使用假货的仪器测试和使用实时实现之间切换。相反,您可以在实际应用程序中使用您的虚假实现,如果您只想尝试使用模拟数据的应用程序,这可能会很好。
我希望这有助于至少促进一些想法,关于如何解决“一个接口(interface)的两个实现”的困境!

关于android - 如何在所有测试中轻松地用假货替换生产 Hilt 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64815848/

相关文章:

android - Dagger Hilt 没有在测试中注入(inject)

android - 如何在 Jetpack Compose "false"或 "row"中设置 ClipsToBounds "column"

java - ANDROID:使用轨迹球和触摸时突出显示/选择

java - Android SSL套接字证书吊销检查

android - 是否可以在 android/ios/flutter 中同时播放多个音频文件?

c# - DependencyInjection 是否支持自动注册服务?

c# - CaSTLe Windsor 依赖注入(inject),基于客户的自定义实现

java - Spring @Component 在 @PostConstruct 完成之前可用

android - 已应用 Hilt Android Gradle 插件但没有 com.google.dagger :hilt-android-compiler dependency was found

Android AES 和初始化向量