Android Mockito如何Mock工具函数返回值且不执行原方法?
解决Mockito Mock Kotlin顶层函数不执行原方法的问题
你的问题核心在于Kotlin顶层函数会被编译为Java静态方法,普通的when()/given()语法会先执行原方法生成调用桩,这就触发了空指针。要实现仅Mock返回值、不执行原方法,需要用Mockito的静态Mock能力,具体步骤如下:
1. 引入必要依赖
确保测试依赖中包含mockito-inline(Mockito核心库不支持静态Mock),Gradle配置示例:
testImplementation "org.mockito:mockito-inline:4.11.0" // 版本可根据项目调整
2. 使用mockStatic拦截顶层函数调用
Kotlin顶层函数会被打包成[文件名]Kt的Java类(比如你的isOnline在NetworkUtils.kt中,对应类是NetworkUtilsKt),通过mockStatic创建该类的静态Mock,在作用域内指定返回值:
import org.junit.Test import org.mockito.Mockito import org.mockito.kotlin.any class YourTestClass { @Test fun testNetworkDependentLogic() { // 创建静态Mock,use块会自动关闭Mock Mockito.mockStatic(NetworkUtilsKt::class.java).use { mockedStatic -> // 指定isOnline无论传入什么Context,都返回true mockedStatic.`when`<Boolean> { isOnline(any()) } .thenReturn(true) // 这里执行你的业务逻辑测试,此时调用isOnline会直接返回Mock值,不会执行原方法 // 比如调用依赖isOnline的网络请求方法 // yourService.doNetworkRequest() } } }
替代方案:封装顶层函数到单例类
如果不想使用静态Mock,可以将顶层函数封装到单例类中,用普通Mockito Mock方式处理:
// 重构工具类 object NetworkUtils { fun isOnline(context: Context): Boolean { // 原顶层函数的实现逻辑 } }
测试时Mock这个单例:
@Test fun testWithSingleton() { val mockNetworkUtils = Mockito.mock(NetworkUtils::class.java) Mockito.`when`(mockNetworkUtils.isOnline(any())).thenReturn(true) // 后续业务逻辑调用mockNetworkUtils.isOnline即可 }
内容的提问来源于stack exchange,提问作者Alon
相关产品推荐
相关产品推荐

