【问题标题】:Configuring gradle to use JUnit, Mockito, Hamcrest and Espresso配置 gradle 以使用 JUnit、Mockito、Hamcrest 和 Espresso
【发布时间】:2015-01-02 04:33:36
【问题描述】:

我有一个使用 Mockito、Hamcrest 和 Espresso 来帮助测试的 Android 项目。

无论我对 Gradle 构建文件进行什么尝试,当我在执行 gradle androidTestCompile 之后尝试运行测试时,我都会得到一个 NoSuchMethodError for org.hamcrest.Matcher.anyOf

这是我目前的配置:

dependencies {
    compile project(':GameCore')
    androidTestCompile files(
            'libs/espresso-1.1.jar',
            'libs/testrunner-1.1.jar',
            'libs/testrunner-runtime-1.1.jar'
    )
    androidTestCompile(
            'junit:junit:4.11',
            'org.mockito:mockito-core:1.10.0',
            'com.google.guava:guava:14.0.1',
            'com.squareup.dagger:dagger:1.1.0',
            'com.google.dexmaker:dexmaker:1.0',
            'com.google.dexmaker:dexmaker-mockito:1.0',
            'org.hamcrest:hamcrest-core:1.3',
            'org.hamcrest:hamcrest-library:1.3'
            )

我尝试重写 Mockito 和 JUnit 要求以排除 Hamcrest,如下所示:

androidTestCompile('junit:junit:4.11') {
    exclude group: 'org.hamcrest'
}

但这没有任何区别。

GameCore 项目是一个纯 Java 项目。它还依赖于 JUnit 和 Mockito,但由于它们被指定为 testCompile,我认为它们不应该干扰。

“androidTestCompile”这个模块的gradle dependencies 的输出是:

+--- junit:junit:4.11                                                               
|    \--- org.hamcrest:hamcrest-core:1.3
+--- org.mockito:mockito-core:1.10.0
|    +--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    \--- org.objenesis:objenesis:2.1
+--- com.google.guava:guava:14.0.1
+--- com.squareup.dagger:dagger:1.1.0
|    \--- javax.inject:javax.inject:1
+--- com.google.dexmaker:dexmaker:1.0
+--- com.google.dexmaker:dexmaker-mockito:1.0
|    +--- com.google.dexmaker:dexmaker:1.0
|    \--- org.mockito:mockito-core:1.9.5 -> 1.10.0 (*)
+--- org.hamcrest:hamcrest-core:1.3
\--- org.hamcrest:hamcrest-library:1.3
     \--- org.hamcrest:hamcrest-core:1.3

编辑

在进一步调查该问题后,我发现 espresso 需要 Hamcrest 1.1,但我也在使用 Hamcrest 1.3 中的 assertThat。 Hamcrest 1.3 没有 espresso 使用的 anyOf 方法。所以我想我被卡住了:)

【问题讨论】:

  • 您可以在该模块上运行gradle dependencies 并发布相关任务的输出吗?

标签: android junit gradle mockito android-espresso


【解决方案1】:

我目前在我的 Android Gradle 项目中使用所有这些库(我也非常喜欢测试和 TDD :))。

这是我的 build.gradle 文件的依赖部分:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleDependency
    compile 'com.google.android.gms:play-services:5.0.89'
    provided 'com.squareup.dagger:dagger-compiler:1.2.1'
    compile 'com.jakewharton:butterknife:5.1.2'
    compile 'com.squareup.dagger:dagger:1.2.1'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
    compile 'com.squareup.okhttp:okhttp:2.0.0'
    compile 'com.squareup.retrofit:retrofit:1.6.0'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.squareup:otto:1.3.5'
    compile 'javax.annotation:javax.annotation-api:1.2'
    compile 'com.google.code.findbugs:jsr305:1.3.9'
    compile 'com.j256.ormlite:ormlite-android:4.43'
    compile 'com.j256.ormlite:ormlite-core:4.43'
    compile 'com.android.support:support-v13:20.0.0'
    compile 'com.path:android-priority-jobqueue:1.1.2'
    compile'com.squareup.picasso:picasso:2.3.3'
    compile 'com.github.johnkil.android-robototextview:robototextview:2.1.0'
    compile 'se.emilsjolander:stickylistheaders:2.5.0'
    compile 'com.newrelic.agent.android:android-agent:4.+'

    compile 'com.github.chrisbanes.actionbarpulltorefresh:library:0.9.9'

    //mockito dependencies
    androidTestCompile 'org.mockito:mockito-core:1.9.5'
    androidTestCompile files('libs/dexmaker-mockito-1.0.jar')
    androidTestCompile files('libs/dexmaker-1.0.jar')

    //espresso dependencies
    androidTestCompile 'com.google.guava:guava:18.0'
    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.1'
    androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
        exclude group: 'com.squareup.dagger'
    }
    compile('com.crashlytics.sdk.android:crashlytics:2.0.0@aar') {
        transitive = true;
    }
}

其中很多您可能会忽略,因此这里列出了要测试的特定内容:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':facebook')
    compile project(':library')
    //noinspection GradleDependency

    //mockito dependencies
    androidTestCompile 'org.mockito:mockito-core:1.9.5'
    androidTestCompile files('libs/dexmaker-mockito-1.0.jar')
    androidTestCompile files('libs/dexmaker-1.0.jar')

    //espresso dependencies
    androidTestCompile 'com.google.guava:guava:18.0'
    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.1'
    androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') 
}

dexmaker 库可以在这里找到: https://code.google.com/p/dexmaker/downloads/detail?name=dexmaker-1.0.jar&can=2&q=

这里:

https://code.google.com/p/dexmaker/downloads/detail?name=dexmaker-mockito-1.0.jar&can=2&q=

【讨论】:

  • 感谢您发布构建文件,但我在这里没有看到 hamcrest。它在你的 libs 目录中吗?
  • Hamcrest 带有浓缩咖啡,所以我希望它全部包含在该库中。
  • 嗯,好的。我没有使用 espresso 的多合一版本,因为我试图避免依赖冲突,因此我单独包含了 hamcrest
【解决方案2】:

我意识到 assertThat 在 Hamcrest 1.1 中,它只是在 hamcrest-integration 而不是 hamcrest-core。我更改了构建文件,现在一切正常:

androidTestCompile files(
        'libs/espresso-1.1.jar',
        'libs/testrunner-1.1.jar',
        'libs/testrunner-runtime-1.1.jar'
)
androidTestCompile(
        'org.mockito:mockito-core:1.9.5',
        'com.google.dexmaker:dexmaker-mockito:1.0',
        'com.google.dexmaker:dexmaker:1.0',
        'com.google.guava:guava:14.0.1',
        'com.squareup.dagger:dagger:1.1.0',
        'org.hamcrest:hamcrest-core:1.1',
        'org.hamcrest:hamcrest-integration:1.1',
        'org.hamcrest:hamcrest-library:1.1'
)

我尝试使用 espresso-1.1-bundled.jar,但这会导致 dex 错误,因为引入了 Hamcrest 1.1 的两个副本,所以我不得不将它从一堆依赖项中排除。

【讨论】:

  • 太棒了!我很高兴你让它工作。我个人更喜欢 Jake Wharton 捆绑的浓缩咖啡套餐,但对每个人来说都是他自己的。祝测试愉快!
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多