Mockk verify is trying to verify Log.d() which is never been called

1.7k Views Asked by At

So, I have written unit test as follows. Which basically calls a method in Viewmodel class.

    @Test
    fun `on clear Cached Calls AppUtility ClearCache`() {
        sut.clearCache()
        verify(exactly = 1) {
            appUtilityMock.clearCache()
        }
    }

Method in Viewmodel

    fun clearCache() {
        Log.d(TAG, "clearCache:e ")
        avonUtility.clearCache()
    }

As you can see, I am trying ti verify if clearCache() function is called.

And when I run the test I get following error. And it works(successful) as soon as I delete the line

Log.d(TAG, "clearCache:e ").

Error stack trace

java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
    at android.util.Log.d(Log.java)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
    at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
    at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:83)
    at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:20)
    at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:28)
    at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:227)
    at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:15)
    at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42)
    at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
    at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:53)
    at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:263)
    at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:25)
    at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
    at android.util.Log.d(Log.java)

I have mock AppUtility like private val appUtilityMock: AppUtility = mockk(relaxed = true).

I am not sure what is going wrong. Please help me understand. I am using MockK for testing.

1

There are 1 best solutions below

0
Stephan On BEST ANSWER

You are calling the function Log.d, but this is in android.util.Log and therefore not available in your tests. See the documentation for more information. You can add a default implementation by adding this to your gradle file in the android { part:

testOptions { 
   unitTests.returnDefaultValues = true
}

You could also inject a wrapper around your Log and mock that one, like you do with AppUtility.