为什么我们需要排除依赖项才能使 Android JUNIT 测试正常工作?

Why do we need to exclude dependencies to get Android JUNIT tests to work?

尝试运行 Android Espresso 测试时,junit 运行ner 无法instantiate/find 您正在测试的class。这可以通过更新 build.gradle 文件来解决,但为什么需要这样做?感谢您的任何见解!

例如,下一行将创建如下所示的异常。

联合测试:

@Rule
public ActivityTestRule<ChurchesActivity> mChurchesActivityTestRule =
        new ActivityTestRule<>(ChurchesActivity.class);

运行ning测试时产生异常:

junit.framework.AssertionFailedError: Exception in constructor: toolbarHasApplicationName (java.lang.NoClassDefFoundError: es.unizar.vv.mobile.catmdedit.app.view.ChurchesActivity

此问题已通过更新您的 build.gradle 以排除特定 groups/modules(见下文)得到解决,但为什么需要这样做?

dependencies {
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.0') {
    exclude group: 'com.android.support', module: 'appcompat'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude module: 'recyclerview-v7'
}

}

此问题是以下问题的后续问题:

它是必需的,因为在使用 Gradle 时,您有时可能会与传递依赖项发生版本冲突 (您要使用的库包含的依赖项)。您可以阅读更多相关信息 here

例如,espresso-contrib 库的 recyclerview-v7 库的版本可能与中引用的版本不同您的应用程序的依赖项。因此,您可以排除它,也可以通过以下方式明确说明您要使用哪个版本的库:

ext {
    supportLibraryVersion = '23.1.1'
}

configurations.all {
    resolutionStrategy.force "com.android.support:support-annotations:$supportLibraryVersion"
    resolutionStrategy.force "com.android.support:recyclerview-v7:$supportLibraryVersion"
    resolutionStrategy.force "com.android.support:support-v4:$supportLibraryVersion"
}

似乎是 Android 工作室中的错误。据报道 here 并且应该在 android gradle 插件 2.0+ 中修复。