Duplicate class org.hamcrest.BaseDescription found in modules jetified-hamcrest-core-1.3.jar
Asked Answered
F

2

8

Android studio 3.6

app/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'

in gradle.properties:

android.useAndroidX=true
android.enableJetifier=true

Here my Espresso instrumentation test:

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\"))")
        )
    }

But I get error:

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)
Folder answered 28/11, 2019 at 9:25 Comment(1)
H
5

The exclusion of junit and giving the priority to Hamcrest will disable the oppotunity to perform unit tests with JUnit! That is why you would get an error in Android studio: Cannot resolve '@Before' or '@Test' while doing unit tests. The correct way to go will be replacing the Hamcrest with JUnit!

Place this code to build.gradle on app level:

configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('org.hamcrest:hamcrest-core:1.1') with module('junit:junit:4.10')
    }
}
Headlight answered 17/5, 2021 at 19:28 Comment(2)
works for me when I add it to the app module and not the project build file. learned that lesson hard.Humankind
A problem occurred evaluating project ':manager'. > No signature of method: org.gradle.api.internal.artifacts.ivyservice.dependencysubstitution.DefaultDependencySubstitutions$1.with() is applicable for argument types: (org.gradle.internal.component.external.model.DefaultModuleComponentSelector) values: [junit:junit:4.10] Possible solutions: with(groovy.lang.Closure), with(boolean, groovy.lang.Closure), wait(), wait(long), find(), wait(long, int)Country
Q
3

I think this problem happened when you add a dependency (as your situation Hamcrest and another dependency, library, Jar files, etc... is using Hamcrest too! but with another version.

If you force your Hamcrest dependency in app Gradle like below might solve your problem:

configurations.all {
    resolutionStrategy {
        force 'org.hamcrest:hamcrest-junit:2.0.0.0'
    }
}

After apply if you get the same error try to exclude like this:

configurations { compile.exclude group: "junit", module: "junit" }
Quilmes answered 28/11, 2019 at 11:26 Comment(2)
Try this : configurations { compile.exclude group: "junit", module: "junit"}Quilmes
compile.exclude will make you unable to perform unit tests! Please avoid any exclusions, the correct way to go will be replacing hamcrest with junit! configurations.all { resolutionStrategy.dependencySubstitution { substitute module('org.hamcrest:hamcrest-core:1.1') with module('junit:junit:4.10') } }Headlight

© 2022 - 2024 — McMap. All rights reserved.