【问题标题】:Android Gradle Unit Testing migration from JARs- duplicate hamcrest files from junit and mockito从 JAR 迁移 Android Gradle 单元测试 - 从 junit 和 mockito 复制 hamcrest 文件
【发布时间】:2014-08-01 16:31:13
【问题描述】:

我终于将使用 JAR 文件运行的旧单元测试迁移到使用 gradle,但是我在获得正确的组合时遇到了很多麻烦,而且我不确定我在做什么是对还是错。首先,这些都是我正在使用的jar文件。

dexmaker-1.0.jar
dexmaker-mockito-1.0.jar
fest-android-1.0.7.jar
fest-assert-core-2.0M10.jar
fest-util-1.2.5.jar
junit-4.11.jar
mockito-all-1.9.5.jar
the-missing-android-xml-junit-test-runner-release-1.3_2.jar  <---- I think this is used to get reports for the unit tests, is there a way that I don't have to use this anymore?

当我将所有这些 JAR 作为 JAR 导入时,它工作正常,所以这是一件好事,但并不理想:

androidTestCompile fileTree(dir: 'libs/test', include: '*.jar')

接下来,我尝试将所有 JAR 文件更改为 gradle-maven 依赖项,如下所示

androidTestCompile fileTree(dir: 'libs/test', include: '*.jar')
androidTestCompile 'junit:junit:4.11+'
androidTestCompile ('com.squareup:fest-android:1.0.+') {
    exclude group: 'com.android.support'
}
androidTestCompile 'org.easytesting:fest-assert-core:2.0M10'
androidTestCompile 'org.easytesting:fest-util:1.2.+'
androidTestCompile 'org.mockito:mockito-all:1.9.+'
androidTestCompile 'com.google.dexmaker:dexmaker:1.+'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.+'

这不起作用,因为在尝试构建和运行单元测试时,我得到了以下结果:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/Description;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    ... 

所以我在Android Gradle DexException: Multiple dex files define Lorg/hamcrest/Description Android testing: 'Multiple dex files' when using 'gradle check connectedCheck' Android + Powermock + Mockito + Maven build error with ClassNotFoundException 找了几个地方来帮助我解决这个问题,他们建议我尝试以下方法:

androidTestCompile fileTree(dir: 'libs/test', include: '*.jar')
androidTestCompile('junit:junit:4.11+') {
    exclude group: 'org.hamcrest'
}
androidTestCompile ('com.squareup:fest-android:1.0.+') {
    exclude group: 'com.android.support'
}
androidTestCompile 'org.easytesting:fest-assert-core:2.0M10'
androidTestCompile 'org.easytesting:fest-util:1.2.+'
androidTestCompile 'org.mockito:mockito-all:1.9.+'
androidTestCompile 'com.google.dexmaker:dexmaker:1.+'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.+'

androidTestCompile fileTree(dir: 'libs/test', include: '*.jar')
androidTestCompile 'junit:junit:4.11+'
androidTestCompile ('com.squareup:fest-android:1.0.+') {
    exclude group: 'com.android.support'
}
androidTestCompile 'org.easytesting:fest-assert-core:2.0M10'
androidTestCompile 'org.easytesting:fest-util:1.2.+'
androidTestCompile('org.mockito:mockito-all:1.9.5') {
    exclude group: 'org.hamcrest'
}
androidTestCompile 'com.google.dexmaker:dexmaker:1.+'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.+'

但仍然产生以下结果:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/Description;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)

我根据一些建议尝试了以下方法来更改 junit 和 mockito。

androidTestCompile 'junit:junit-dep:4.11+'
androidTestCompile 'org.mockito:mockito-core:1.9.+'

我得到了

Error: duplicate files during packaging of APK /.../app/build/outputs/apk/app-debug-test-unaligned.apk
Path in archive: LICENSE.txt
Origin 1: /.../.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar
Origin 2: /.../.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar
You can ignore those files in your build.gradle:
android {
  packagingOptions {
    exclude 'LICENSE.txt'
  }
}
FAILED
FAILURE: Build failed with an exception.
Execution failed for task ':app:packageDebugTest'.

在 APK LICENSE.txt 中复制的重复文件 文件1:/Users/simonadmin/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar 文件2:/Users/simonadmin/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar

对此有何建议或帮助?我不想重新使用 JAR。

【问题讨论】:

标签: android junit gradle


【解决方案1】:

实际上,我最后只是通过添加来解决它,并且它起作用了。

android {
    // stuff before

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'LICENSE.txt'
    }
}

而我的依赖有以下

dependencies {
    androidTestCompile ('com.squareup:fest-android:1.0.+') {
        exclude group: 'com.android.support'
    }
    androidTestCompile 'com.google.dexmaker:dexmaker:1.+'
    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.+'

    androidTestCompile 'junit:junit:4.11'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
    androidTestCompile 'org.mockito:mockito-core:1.9.5'
}

【讨论】:

    【解决方案2】:

    我也面临同样的问题。

    @lazypig 已经提到了他的 build.gradle 部分的最终版本。

    但原因是org.hamcrest.Description封装在mockito-all.jar中。因此,当依赖关系更改为mockito-core 时,类路径中只有一个hamcrest-core.jar 来自junit.jar

    但是,我仍然无法弄清楚为什么 exclude 在这种情况下不起作用!

    【讨论】:

    • 我的猜测是问题不在于exclude,而在于mockito-all.jar 包装。我的猜测是 Mockito 作者从 hamcrest-library 复制了一些类,而不是使用依赖项,而 Gradle 构建认为这些类是不同的。
    • 我检查了 mockito-all 包代码。他们确实抄袭了一些课程。我觉得这种做法很奇怪。
    猜你喜欢
    • 2016-09-02
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多