与 TestInstallIn 重复绑定以进行插桩测试
Duplicate bindings with TestInstallIn for instrumented test
我正在使用 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,
注释掉假模块解决了这个问题。有人看到我在这里遗漏了什么吗?
编辑:刚刚尝试使用 @UninstallModules
和 运行 进入相同的构建错误:
@UninstallModules(SomethingModule::class)
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class MyInstrumentedTest {
@Module
@InstallIn(SingletonComponent::class)
object FakeSomethingModule {
@Provides
fun provideSomthing(): Something = FakeSomething()
}
为了最终找到解决方案,我尝试了很多不同的方法:
确保伪造的实现具有 @Inject constructor()
在测试中 @Module
使用 @Binds
和摘要 class 而不是 @Provides
您不需要一个组合所有模块的组件,此代码不是必需的:
@Module(
includes = [ <modules> ]
- 在这个示例中并不明显,但在我的实际代码中,我试图测试的模块被包含为另一个 class 使用
@Module(includes = SomethingBinding)
的绑定。我为我想在我的仪器测试中模拟的对象创建了一个模块
我正在使用 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,
注释掉假模块解决了这个问题。有人看到我在这里遗漏了什么吗?
编辑:刚刚尝试使用 @UninstallModules
和 运行 进入相同的构建错误:
@UninstallModules(SomethingModule::class)
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class MyInstrumentedTest {
@Module
@InstallIn(SingletonComponent::class)
object FakeSomethingModule {
@Provides
fun provideSomthing(): Something = FakeSomething()
}
为了最终找到解决方案,我尝试了很多不同的方法:
确保伪造的实现具有
@Inject constructor()
在测试中
@Module
使用@Binds
和摘要 class 而不是@Provides
您不需要一个组合所有模块的组件,此代码不是必需的:
@Module(
includes = [ <modules> ]
- 在这个示例中并不明显,但在我的实际代码中,我试图测试的模块被包含为另一个 class 使用
@Module(includes = SomethingBinding)
的绑定。我为我想在我的仪器测试中模拟的对象创建了一个模块