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
相关产品推荐
相关产品推荐

