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

时间:2015-12-27 00:26:26

标签: android android-testing

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

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

junit test:

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

运行测试时生成异常:

  

junit.framework.AssertionFailedError:构造函数中的异常:   toolbarHasApplicationName(java.lang.NoClassDefFoundError:   es.unizar.vv.mobile.catmdedit.app.view.ChurchesActivity

通过更新build.gradle以排除特定组/模块(见下文)解决了此问题,但为什么需要这样做?

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'
}

}

这个问题是对以下问题的跟进:

Android Tests Exception in Constructor NoClassDefFoundError

2 个答案:

答案 0 :(得分:2)

需要它,因为在使用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"
}

答案 1 :(得分:0)

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