在我的测试模块中提供 HiltTestApplication 作为依赖项失败

Posted

技术标签:

【中文标题】在我的测试模块中提供 HiltTestApplication 作为依赖项失败【英文标题】:Getting failed in providing HiltTestApplication as a dependency in my test module 【发布时间】:2021-08-14 17:07:42 【问题描述】:

我已遵循this 指南并尝试使用 HILT 运行检测测试。但在我的测试模块中提供HiltTestApplication 作为依赖项失败了。 下面是我的模块类-

@ExperimentalCoroutinesApi
@FlowPreview
@Module
@TestInstallIn(components = [SingletonComponent::class],
    replaces = [ProductionModule::class])
object TestModule 

    @JvmStatic
    @Singleton
    @Provides
    fun provideRecipeDb(app: HiltTestApplication): RecipeDatabase 
        return Room
            .inMemoryDatabaseBuilder(app, RecipeDatabase::class.java)
            .fallbackToDestructiveMigration()
            .build()
    

遇到以下错误-

C:\Users\bhuvn\androidStudioProjects\Dairy\app\build\generated\source\kapt\debugAndroidTest\com\bhuvnesh\diary\framework\dataSource\cache\RecipeDaoServiceTests_HiltComponents.java:128: 错误:[Dagger/MissingBinding] dagger.hilt.android.testing.HiltTestApplication 无法提供 没有@Inject 构造函数或@Provides 注释方法。 公共抽象静态类 SingletonC 实现 RecipeDaoServiceTests_GeneratedInjector, ^ dagger.hilt.android.testing.HiltTestApplication 在注入 com.bhuvnesh.diary.di.TestModule.provideRecipeDataFactory(应用程序, �) com.bhuvnesh.diary.framework.dataSource.data.RecipesDataFactory 注入于 com.bhuvnesh.diary.framework.dataSource.cache.RecipeDaoServiceTests.recipeDataFactory com.bhuvnesh.diary.framework.dataSource.cache.RecipeDaoServiceTests 是 注射于 com.bhuvnesh.diary.framework.dataSource.cache.RecipeDaoServiceTests_GeneratedInjector.injectTest(com.bhuvnesh.diary.framework.dataSource.cache.RecipeDaoServiceTests) 它也被要求在: com.bhuvnesh.diary.di.TestModule.provideRecipeDb(app)

我还尝试通过在同一模块中手动提供依赖项-

    @JvmStatic
    @Singleton
    @Provides
    fun provideHiltTestApplication():HiltTestApplication
        return HiltTestApplication()
    

但它提供了一个导致 nullpointerexception 的空对象。

【问题讨论】:

【参考方案1】:

要提供应用程序上下文,您需要将app: HiltTestApplication 替换为@ApplicationContext app: Context,因为HiltTestApplication 是可用于使用 Hilt 进行 Android 仪器或 Robolectric 测试的基础应用程序,但必须在其注释中指定(就像这个@Config(application = HiltTestApplication::class))。因此,要在方法中提供上下文,您需要添加预定义的限定符来提供它。看看这些

https://developer.android.com/training/dependency-injection/hilt-android#predefined-qualifiers https://developer.android.com/training/dependency-injection/hilt-testing#robolectric-tests

【讨论】:

以上是关于在我的测试模块中提供 HiltTestApplication 作为依赖项失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Maven Spring Boot 多模块项目的测试中引用兄弟模块?

未定义 Angular 返回模块中的测试服务

Keycloak 用户联合提供程序模块日志记录级别

更改部署目标后无法再将应用模块导入单元测试

测试运行器(开玩笑)未能导入 expo 模块

测试目标中的 pod 没有返回此类模块错误