使用Mockito测试Kotlin代码时barMock触发空指针异常如何解决
问题原因
你的测试代码存在两处核心错误导致空指针及验证失败:
- 模拟对象逻辑错误
你创建的fooMock是Mockito生成的完全模拟对象,默认不会执行Foo类的真实方法逻辑,你调用fooMock.someMethod()时不会触发真实实现,自然不会调用barMock.anotherMethod()。同时你编写的FooBuilder完全没有被使用:你提前mock了FooBuilder并做了方法桩定义,但后续根本没有调用fooBuilderMock.makeFoo(barMock)获取实例,反而自行mock了Foo对象,之前的桩定义完全不生效。 - 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
相关产品推荐
相关产品推荐

