7

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)
Alexei
  • 14,350
  • 37
  • 121
  • 240

2 Answers2

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')
    }
}
M22
  • 543
  • 5
  • 10
  • 2
    works for me when I add it to the app module and not the project build file. learned that lesson hard. – JPM Apr 21 '22 at 19:59
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" }
James Davis
  • 474
  • 4
  • 10
Sepehr
  • 960
  • 11
  • 17
  • 4
    Try this : configurations { compile.exclude group: "junit", module: "junit"} – Sepehr Nov 28 '19 at 16:43
  • 1
    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') } } – M22 May 17 '21 at 19:24