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

