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.
CodePudding user response:
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
.