如何使用Mockito模拟方法?抽象类继承方法模拟失败排查
问题分析与解决方案
你遇到的问题核心原因是 Kotlin默认所有方法都是final的,而Mockito的常规版本无法mock或spy final方法,所以你预设的返回值根本不会生效,调用spy.hello()还是会执行原方法的逻辑(另外你的原抽象类hello()方法还有个小问题:缺少return关键字,这会导致编译错误,得补上)。
下面是具体的解决办法:
方法一:将抽象类的方法改为open
在Kotlin中,只有open修饰的方法才能被重写或Mockito处理。修改你的抽象类代码:
abstract class AbstractMyClass { open fun hello(): String { return "bello" } // 加上open和return关键字 }
修改后,Mockito就能正常拦截这个方法并返回你预设的"cello"了,你的测试代码不需要改动。
方法二:使用Mockito Inline插件
如果你不想修改原有代码的修饰符,可以引入Mockito的inline插件,它支持mock final类和方法。在你的构建文件中添加依赖:
如果是Gradle(Kotlin DSL):
testImplementation("org.mockito:mockito-inline:5.6.0") // 可替换为最新稳定版本
如果是Gradle(Groovy):
testImplementation 'org.mockito:mockito-inline:5.6.0'
添加依赖后,不需要修改抽象类的方法,你的原有测试代码就能正常工作。
额外注意点
你原抽象类中的hello()方法存在语法错误:fun hello(): String { "bello" } 缺少return关键字,这会导致编译失败,无论用哪种方案都需要补上return才能正常运行。
内容的提问来源于stack exchange,提问作者Nischit Pradhan
相关产品推荐
相关产品推荐

