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

使用Mockito测试Kotlin代码时barMock触发空指针异常如何解决

问题原因

你的测试代码存在两处核心错误导致空指针及验证失败:

  1. 模拟对象逻辑错误
    你创建的fooMock是Mockito生成的完全模拟对象,默认不会执行Foo类的真实方法逻辑,你调用fooMock.someMethod()时不会触发真实实现,自然不会调用barMock.anotherMethod()。同时你编写的FooBuilder完全没有被使用:你提前mock了FooBuilder并做了方法桩定义,但后续根本没有调用fooBuilderMock.makeFoo(barMock)获取实例,反而自行mock了Foo对象,之前的桩定义完全不生效。
  2. Kotlin特性兼容问题
    Kotlin的类方法默认是final修饰,即使你给Foo类加了open修饰,someMethod方法没有显式加open的话,默认还是final属性,Mockito默认无法正确mock final方法,调用时会出现空指针异常。
解决方案

根据你的测试场景选择对应方案:

场景1:测试Foo类的someMethod逻辑(最常见场景)

你不需要mockFoo,也不需要FooBuilder,直接构造真实的Foo实例注入mock的Bar即可:

val barMock = mock(Bar::class.java)
// 构造真实的被测Foo实例
val fooUnderTest = Foo(barMock)
fooUnderTest.someMethod()
// 验证调用
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()

场景2:必须使用FooBuilder构造Foo实例

如果你的业务逻辑依赖FooBuilder生成Foo,使用真实的FooBuilder构造实例即可,不需要mock Builder:

val barMock = mock(Bar::class.java)
val fooBuilder = FooBuilder()
val fooUnderTest = fooBuilder.makeFoo(barMock)
fooUnderTest.someMethod()
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()

Kotlin final特性兼容配置

如果你确实需要mock Kotlin默认final的类或方法时,引入mockito-inline依赖即可支持mock final类型,不需要手动给类/方法加open修饰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:03