与 TestInstallIn 重复绑定以进行仪器测试

ali*_*ter 9 android dagger dagger-hilt

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

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

    @Provides
    fun provideSomething(@ApplicationContext context: Context): Something {
        //return RealSomething
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    @Provides
    fun provideSomethingModule(): Something {
        return FakeSomething()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

error: [Dagger/DuplicateBindings] com.example.Something is bound multiple times:
  public abstract static class SingletonC implements HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint,
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

        @Provides
        fun provideSomthing(): Something = FakeSomething()
    }
Run Code Online (Sandbox Code Playgroud)

ali*_*ter 2

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

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

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

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

@Module(
    includes = [ <modules> ]
Run Code Online (Sandbox Code Playgroud)
  1. 在这个示例中并不明显,但在我的实际代码中,我试图测试的模块被包含为使用@Module(includes = SomethingBinding). 我专门为我想在仪器测试中模拟的对象创建了一个模块