【问题标题】:Duplicate bindings with TestInstallIn for instrumented test使用 TestInstallIn 重复绑定以进行检测测试
【发布时间】:2021-06-26 03:20:26
【问题描述】:

我正在使用 Hilt 注入一些依赖项,如下所示:

@Module
@InstallIn(SingletonComponent::class)
object SomethingModule {

    @Provides
    fun provideSomething(@ApplicationContext context: Context): Something {
        //return RealSomething
    }
}

我想在我的测试中替换这个绑定,并按照这个 guide 我将此假模块添加到与我的插桩测试相同的文件夹中:

@Module
@TestInstallIn(
    components = [SingletonComponent::class],
    replaces = [SomethingModule::class]
)
object FakeSomethingModuleModule {

    @Provides
    fun provideSomethingModule(): Something {
        return FakeSomething()
    }
}

当我尝试运行我的检测测试时,构建失败并出现重复绑定错误:

error: [Dagger/DuplicateBindings] com.example.Something is bound multiple times:
  public abstract static class SingletonC implements HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint,

注释掉 Fake Module 可以解决问题。有人看到我在这里缺少什么吗?

编辑:刚刚尝试使用 @UninstallModules 并遇到相同的构建错误:

@UninstallModules(SomethingModule::class)
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class MyInstrumentedTest {

    @Module
    @InstallIn(SingletonComponent::class)
    object FakeSomethingModule {

        @Provides
        fun provideSomthing(): Something = FakeSomething()
    }

【问题讨论】:

  • Something is bound multiple times 这个问题是因为你提供了来自两个不同模块的Something 依赖。您可以从测试模块中删除 SomethingModule。
  • @0xAliHn 我正在尝试替换测试中的一个模块,第二个模块是故意的。 TestInstallIn 是 Hilt 的一项功能,可让您执行此操作。

标签: android dagger dagger-hilt


【解决方案1】:

为了最终找到解决方案,我尝试了很多不同的方法:

  1. 确保伪造的实现有@Inject constructor()

  2. 在测试中@Module 使用@Binds 和一个抽象类而不是@Provides

  3. 您不需要组合所有模块的组件,此代码不是必需的:

@Module(
    includes = [ <modules> ]
  1. 在这个示例中并不明显,但在我的实际代码中,我尝试测试的模块被包含为使用@Module(includes = SomethingBinding) 与另一个类的绑定。我为我想在我的仪器测试中模拟的对象创建了一个模块

【讨论】:

  • 有了这些要求,@TestInstallIn 对很多事情都毫无用处。我一直试图让它与 Room DB 一起工作并且不断失败。该类在库中,因此我无法对其进行修改。要构造一个实例,需要从 Room 调用工厂函数,因此需要 @Provides。我想在测试中提供数据库的内存版本。你有没有想办法让它与@Provides一起工作?
猜你喜欢
  • 2016-11-16
  • 2011-12-24
  • 1970-01-01
  • 2011-03-28
  • 2015-11-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多