gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:44:29 26 4
gpt4 key购买 nike

我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com