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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:55:25