Mockk verify 正在尝试验证从未被调用过的 Log.d()

Aks*_*aru 1 android unit-testing kotlin mockk mockk-verify

因此,我编写了如下单元测试。它基本上调用 Viewmodel 类中的方法。

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

视图模型中的方法

    fun clearCache() {
        Log.d(TAG, "clearCache:e ")
        avonUtility.clearCache()
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在尝试验证clearCache()函数是否被调用。

当我运行测试时,出现以下错误。一旦我删除该行,它就可以工作(成功)

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

错误堆栈跟踪

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)
Run Code Online (Sandbox Code Playgroud)

我有模拟 AppUtility 像private val appUtilityMock: AppUtility = mockk(relaxed = true).

我不确定出了什么问题。请帮助我理解。我正在使用 MockK 进行测试。

Ste*_*han 5

您正在调用该函数Log.d,但这是在android.util.Log,因此在您的测试中不可用。请参阅文档以获取更多信息。您可以通过将其添加到 gradle 文件的以下部分来添加默认实现android {

testOptions { 
   unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)

您还可以在您的 Log 周围注入一个包装器并模拟该包装器,就像您对AppUtility.