使用Mockito mock方法返回值时得到null值如何解决
问题原因
- 核心错误是你用
mock(Foo.class)创建的是完整的Mock代理对象,这类对象默认不会执行任何方法的真实业务逻辑,所有方法调用会直接返回类型默认值:引用类型返回null,基本类型返回0/false等默认值。你在测试里调用foo.function1(1,2)时,根本没有执行function1内部调用function2的逻辑,直接返回了null,这就是actualResult为null的直接原因。 - 你贴的被测类
Foo的function1方法本身存在语法缺陷:方法声明返回值为ReturnParameters,但方法体内仅调用了function2(a,b),没有写return语句返回结果,就算测试逻辑写对,这段代码本身也无法通过编译。
解决方法
你要测试function1的真实逻辑、仅Mock同类中的function2方法,不能用全量Mock,要用Spy(部分Mock)实现,步骤如下:
- 先修正被测类
Foo的function1方法,补全return逻辑:
class Foo { ReturnParameters function1(int a, int b) { // 补全return,返回function2的执行结果 return function2(a, b); } ReturnParameters function2(int a , int b) { // 方法原有逻辑 return new ReturnParameters(0); } }
- 调整测试类,将全Mock替换为Spy实例,打桩内部方法时使用
doReturn().when()语法避免触发function2的真实调用:
import org.junit.Test; import org.mockito.Mockito; import static org.junit.Assert.assertEquals; class FooTest{ // 创建Spy实例:默认执行方法真实逻辑,仅对打桩的方法做Mock处理 Foo foo = Mockito.spy(new Foo()); @Test public void function1test(){ // 打桩function2方法,入参为1、2时返回指定结果 Mockito.doReturn(new ReturnParameters(100)).when(foo).function2(1,2); ReturnParameters actualResult = foo.function1(1,2); int expectedResult = 100; assertEquals(expectedResult , actualResult.getStatus()); } }
注意:打桩Spy对象的方法时不要用
Mockito.when(foo.function2(1,2)).thenReturn(...)写法,因为这种写法会先真实执行一次function2,若function2依赖未初始化的外部资源会直接报错,doReturn写法可以跳过真实方法执行,更适合内部方法打桩的场景。
如果你坚持要用全Mock实现,也可以额外配置function1走真实方法,但这种写法需要为每个要测试的真实方法单独配置,维护成本高,不推荐:
class FooTest{ Foo foo = Mockito.mock(Foo.class); @Test public void function1test(){ // 配置function1走真实逻辑 Mockito.when(foo.function1(1,2)).thenCallRealMethod(); Mockito.when(foo.function2(1,2)).thenReturn(new ReturnParameters(100)); ReturnParameters actualResult = foo.function1(1,2); int expectedResult = 100; assertEquals(expectedResult , actualResult.getStatus()); } }
内容的提问来源于stack exchange,提问作者primeSuspect
相关产品推荐
相关产品推荐

