Android中的依赖项依赖注入检测测试

时间:2020-06-23 13:28:13

标签: android android-testing dagger-hilt

我正在使用Jitpack Compose构建演示应用程序,并决定将Hilt用于DI。当我运行该应用程序时,一切工作正常,我得到的注入依赖项没有问题,并且该应用程序成功运行,但是,当我尝试运行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相关的代码以帮助缩小问题范围,所以现在看起来像这样;

MyApp.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)
        }
    }
}

LocalRepository.kt

class LocalRepository @Inject constructor() : NewsRepository {

    override fun getNews(callback: (Result<List<Article>>) -> Unit) {
        callback(Result.Success(articles))
    }
}

文章只是虚拟帖子的列表。

NewsRepository.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 Preview 4.2。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

./ gradlew testdebug -stacktrace

并确保在应用程序build.gradle中将source和targetCompatibilty设置为Java.Version_1_8

 compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
}