在模块 jetified-hamcrest-core-1.3.jar 中发现重复的类 org.hamcrest.BaseDescription

a_s*_*ber 8 android hamcrest android-espresso

安卓工作室3.6

应用程序/build.gradle:

 androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2'
    // Espresso framework
    androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
    androidTestImplementation "androidx.test.espresso:espresso-intents:$espresso_version"
    androidTestImplementation "androidx.test.espresso:espresso-contrib:$espresso_version"
    androidTestImplementation 'org.hamcrest:hamcrest-junit:2.0.0.0'

    // UI Automator framework
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.0'

    // for test fragments
    debugImplementation 'androidx.fragment:fragment-testing:1.2.0-rc02'

    testImplementation 'junit:junit:4.12'
    testImplementation 'com.nhaarman:mockito-kotlin-kt1.1:1.5.0'
Run Code Online (Sandbox Code Playgroud)

在 gradle.properties 中:

android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)

这是我的 Espresso 仪器测试:

import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.hamcrest.text.MatchesPattern
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class FeedbackActivityTransportTest {
 @Test
    fun buttonSend_click_checkRequest() {
        val request = mockServer.takeRequest();
        assertEquals("POST", request.method)
        assertThat(
            request.body.toString(),
            MatchesPattern.matchesPattern("(\"feedback.*\\\"type\\\":2\"))")
        )
    }
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

Duplicate class org.hamcrest.BaseDescription found in modules jetified-hamcrest-core-1.3.jar (org.hamcrest:hamcrest-core:1.3) and jetified-java-hamcrest-2.0.0.0.jar (org.hamcrest:java-hamcrest:2.0.0.0)
Duplicate class org.hamcrest.BaseMatcher found in modules jetified-hamcrest-core-1.3.jar (org.hamcrest:hamcrest-core:1.3) and jetified-java-hamcrest-2.0.0.0.jar (org.hamcrest:java-hamcrest:2.0.0.0)
Duplicate class org.hamcrest.Condition found in modules jetified-hamcrest-core-1.3.jar (org.hamcrest:hamcrest-core:1.3) and jetified-java-hamcrest-2.0.0.0.jar (org.hamcrest:java-hamcrest:2.0.0.0)
Duplicate class org.hamcrest.Condition$1 found in modules jetified-hamcrest-core-1.3.jar (org.hamcrest:hamcrest-core:1.3) and jetified-java-hamcrest-2.0.0.0.jar (org.hamcrest:java-hamcrest:2.0.0.0)
Run Code Online (Sandbox Code Playgroud)

小智 5

排除junit并优先考虑Hamcrest将禁用使用 JUnit 执行单元测试的机会!这就是为什么你会在 Android studio 中收到错误:Cannot resolve '@Before' or '@Test'在进行单元测试时。正确的方法是用JUnit替换Hamcrest

将此代码放置到应用程序级别的build.gradle中:

configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('org.hamcrest:hamcrest-core:1.1') with module('junit:junit:4.10')
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当我将其添加到应用程序模块而不是项目构建文件时,它对我有用。吸取了教训。 (2认同)

Sep*_*ehr 3

我认为当您添加依赖项时会发生此问题(因为您的情况Hamcrest和另一个依赖项、库、Jar 文件等...也在使用 Hamcrest!但使用另一个版本。

如果您在应用程序 Gradle中强制使用Hamcrest依赖项,如下所示可能会解决您的问题:

configurations.all {
    resolutionStrategy {
        force 'org.hamcrest:hamcrest-junit:2.0.0.0'
    }
}
Run Code Online (Sandbox Code Playgroud)

应用后,如果遇到相同的错误,请尝试像这样排除:

configurations { compile.exclude group: "junit", module: "junit" }
Run Code Online (Sandbox Code Playgroud)

  • 试试这个:配置{compile.exclude group:“junit”,module:“junit”} (4认同)