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

Kotlin中Mockito模拟方法仍执行真实逻辑及NPE问题求助

问题分析与解决

你的测试失败核心原因是Kotlin中方法默认是final的,Mockito无法mock final方法,导致你创建的mock对象实际上还是调用了真实的doWork()方法,全局变量called被设为true,所以断言失败。

解决步骤

1. 让被mock的方法可继承(open)

修改SUT类的doWork方法,加上open关键字,这样Mockito才能生成代理拦截方法调用:

open class SUT {
    // 加上open关键字,允许Mockito mock这个方法
    open fun doWork(type: String) {
        println("Doing $type work")
        called = true
    }
}

2. 优化测试逻辑(避免全局变量)

全局变量called存在线程安全问题,也容易被其他测试用例干扰,建议用Mockito的验证API替代:

import org.mockito.kotlin.verify

class MockTest {

    @Test
    fun `test doNothing`() {
        val sut: SUT = mock()
        // Mockito对void方法默认就是doNothing,这句可以省略
        // doNothing().whenever(sut).doWork("busy")

        sut.doWork("busy")
        
        // 验证方法被调用了一次,同时mock对象不会执行真实逻辑
        verify(sut).doWork("busy")
    }
}

3. 解决any()导致的NPE问题

使用any()时需要指定类型(Kotlin的类型推断限制),改用any<String>()即可:

doNothing().whenever(sut).doWork(any<String>())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:07:04