You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MockK单元测试运行时因未Mock android.util.Log.d方法报错

问题根因

你运行的是本地JVM环境下的单元测试,而非真机/模拟器上的插桩测试。本地测试环境依赖的Android SDK jar包中,android.util.Log类的所有方法默认没有实际实现,调用时会直接抛出Method not mocked异常,和你Mock的AppUtility逻辑无关——这也是为什么删除Log.d调用后测试可以正常执行。

另外注意到你的ViewModel实现里调用的是avonUtility.clearCache(),需要确认注入ViewModel的utility实例是否是你声明的appUtilityMock,避免后续验证逻辑因为实例不匹配失效,当前报错和这个点无关。

可用解决方案
  • 方案1:Gradle配置全局放行未Mock的Android方法
    在模块级build.gradle的android配置块中加入如下配置,让本地测试中所有未Mock的Android原生方法返回对应类型的默认值(数值类型返回0,引用类型返回null),不再抛出异常:
    android {
        // 其余现有配置
        testOptions {
            unitTests.returnDefaultValues = true
        }
    }
    
    该方案配置简单,适合快速跑通通用单元测试的场景。
  • 方案2:用MockK静态Mock Log类方法
    在测试类中添加测试前后置逻辑,手动Mock Log类的静态方法,避免真实调用原生Log方法:
    import android.util.Log
    import io.mockk.every
    import io.mockk.mockkStatic
    import io.mockk.unmockkStatic
    import org.junit.After
    import org.junit.Before
    
    @Before
    fun mockLog() {
        mockkStatic(Log::class)
        // 按需添加你代码中用到的Log级别方法Mock
        every { Log.d(any(), any()) } returns 0
        every { Log.i(any(), any()) } returns 0
        every { Log.e(any(), any()) } returns 0
        every { Log.w(any(), any<String>()) } returns 0
    }
    
    @After
    fun releaseLogMock() {
        unmockkStatic(Log::class)
    }
    
  • 方案3:如果项目有统一封装的日志工具类,优先Mock自定义的日志工具,比直接Mock系统Log类维护成本更低。

内容的提问来源于stack exchange,提问作者AkshayT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:01:05