Dimas Mendes
Dimas Mendes

Reputation: 2802

Mockito is not recognized by Android (Kotlin)

Here is my class test:

private const val FAKE_STRING = "APP NAME"

@RunWith(MockitoJUnitRunner::class)
class UnitTestSample {
    @Mock
    private lateinit var mockContext: Context

    @Test
    fun readStringFromContext_LocalizedString() {
        // Given a mocked Context injected into the object under test...
        `when`(mockContext.getString(R.string.app_name))
            .thenReturn(FAKE_STRING)
        val myObjectUnderTest = ClassUnderTest(mockContext)

        // ...when the string is returned from the object under test...
        val result: String = myObjectUnderTest.getHelloWorldString()

        // ...then the result should be the expected one.
        assertThat(result, `is`(FAKE_STRING))
    }
}

Here is a piece of my gradle.build.kt (Kotlin DSL):

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("kapt")
    kotlin("android.extensions")
    id("com.onesignal.androidsdk.onesignal-gradle-plugin")
    jacoco
    maven
}

dependencies {
        ...
        //Test base
        testImplementation("junit:junit:4.12")
        testImplementation("org.junit.jupiter:junit-jupiter-api:5.0.3")
        testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.0.3")
        androidTestImplementation("androidx.test:runner:1.2.0")
        androidTestImplementation("androidx.test.espresso:espresso-core:3.2.0")

        //Unit Tests
        testImplementation("org.mockito:mockito-core:3.0.0")
        testImplementation("org.mockito:mockito-inline:3.0.0") //support for kotlin final classes

        //Android UI Test
        androidTestImplementation("org.robolectric:robolectric:3.7.1")
}

As you can see, Android Studio doesn't reognize Mockito. I've already imported org.mockito.junit.MockitoJUnitRunner

mockito not recognized

I'm running this sample unit test under

src/test/java/.../UnitTestSample.kt

Do you have any idea on how to make it work?

Edit (Solution):

I finally made it work with some help of the comments section. The problem was caused by "maven" plugin import on plugins section, and I didn't see that because the base project I downloaded to convert my Gradle to DSL Kotlin had those plugins working. Somehow this was causing Mockito not to be available at compile time, as @MartinZeitler stated. According to @second, "Maven's runtime does not translate to gradle's runtimeOnly but instead compile".

Upvotes: 1

Views: 4149

Answers (2)

Martin Zeitler
Martin Zeitler

Reputation: 76797

The error message is pretty clear: an annotation argument must be a compile time argument.

Replace testImplementation with:

debugImplementation "org.mockito:mockito-android:3.2.4"
debugImplementation "org.mockito:mockito-inline:3.2.4"

Upvotes: 2

second
second

Reputation: 4259

Edit: Cleaned up the answer


For JUnit5 and mockito use the following dependencies (or newer) and scopes:

    testImplementation("org.junit.jupiter:junit-jupiter-api:5.4.2")
    compile("org.junit.jupiter:junit-jupiter-engine:5.4.2")
    testImplementation("org.mockito:mockito-core:3.0.0")
    testImplementation("org.mockito:mockito-junit-jupiter:3.0.0")
    testImplementation("org.mockito:mockito-inline:3.0.0")

In your test use the Extension instead of the Runner (which is for JUnit 4).

@ExtendWith(MockitoExtension::class)


When running with the JUnit 5 dependencies of 5.0.3, I got the following error, so consider upgrading to a newer version (as shown in the dependencies above).

java.lang.NoSuchMethodError: 
org.junit.platform.commons.support.AnnotationSupport.findAnnotation(Ljava/util/Optional;Ljava/lang/Class;)Ljava/util/Optional;
...
Suppressed: java.lang.NullPointerException
at org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:214)

For the maven to gradle conversion I used this site https://sagioto.github.io/maven2gradle/

Upvotes: -1

Related Questions