android - Android中的Hilt依赖注入(inject)仪器测试

标签 android android-testing dagger-hilt

我正在使用 Jitpack Compose 构建一个演示应用程序,并决定将 Hilt 用于 DI。运行应用程序时一切正常,我注入(inject)的依赖项没有问题,应用程序运行成功,但是,当我尝试运行 Instrumentation 测试时,我不断收到以下错误;

Execution failed for task ':app:kaptDebugAndroidTestKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message) 
没有额外的信息可以帮助我找出原因。我删除了大部分 DI 相关代码以帮助我缩小问题范围,所以现在看起来像这样;
我的应用程序.kt
@HiltAndroidApp
class MyApp : Application()
MainActivity.kt
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var newsRepository: LocalRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TodayNewsApp(newsRepository)
        }
    }
}
本地存储库.kt
class LocalRepository @Inject constructor() : NewsRepository {

    override fun getNews(callback: (Result<List<Article>>) -> Unit) {
        callback(Result.Success(articles))
    }
}
文章 只是一个虚拟帖子的列表。
新闻存储库.kt
interface NewsRepository {

    fun getNews(callback: (Result<List<Article>>) -> Unit)
}
关于测试类;我创建了一个自定义运行者
MyCustomTestRunner.kt
class MyCustomTestRunner : AndroidJUnitRunner() {
    override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {
        return super.newApplication(cl, HiltTestApplication::class.java.name, context)
    }
}
并在 defaultConfig 的 app/build.gradle 中使用它
testInstrumentationRunner "app.abedelazizshe.todaynews.MyCustomTestRunner"
对于测试类,无论测试做什么,它都不起作用,例如;
TodayNewsUITest.kt
@HiltAndroidTest
class TodayNewsUITest {

    @get:Rule(order = 0)
    var hiltRule = HiltAndroidRule(this)

    @get:Rule(order = 1)
    val composeTestRule = createComposeRule()

    @Inject
    lateinit var newsRepository: LocalRepository

    @Before
    fun setup() {
        hiltRule.inject()
        composeTestRule.launchApp(newsRepository)
    }

    @Test
    fun app_launches() {
       findByText("TodayNews").assertIsDisplayed()
    }
}
我正在使用
   androidTestImplementation "com.google.dagger:hilt-android-testing:2.28-alpha"
   kaptAndroidTest "com.google.dagger:hilt-android-compiler:2.28-alpha"
当我从 中删除以下行时MainActivity.kt ,测试成功运行。
    @Inject lateinit var newsRepository: LocalRepository
我正在使用 Android Studio 预览版 4.2。
感谢您的帮助

最佳答案

我之前遇到过这个问题,请尝试使用命令运行您的测试,将提供有关该问题的更多详细信息,并且在下一步中可以尝试调试您的测试而不是运行。

./gradlew testdebug -stacktrace


并确保在 app build.gradle source 和 targetCompatibilty 设置为 Java.Version_1_8
 compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
}

关于android - Android中的Hilt依赖注入(inject)仪器测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62535918/

相关文章:

android - 如果没有 @Provides 注释方法,则无法提供。公共(public)抽象静态类 ApplicationC 实现 MyApplication_GeneratedInjector,

java - Android:获取 C++ std::string 直至 JNIEXPORT 被意外清除

android - Flutter - SQFlite - 类型 'String' 不是类型 'double' 的子类型

android - 哪个更好地实现点击监听器?

android - Android Studio 中测试支持库的来源

android - 如何在 android 仪器测试中停止和重新启动 Activity ?

android - Espresso - 如何获取当前 Activity 来测试 Fragments?

Android - 在 TextView 上缩进文本

android - 错误 : cannot find symbol @dagger. hilt.InstallIn(值 = {ApplicationComponent.class})

android - 使用 Jetpack Compose 时如何更好地注入(inject) ViewModel 对象?