Mockito链式Mock参数匹配不支持,按中间方法参数返回值时触发空指针异常
Mockito链式Mock按中间参数返回不同值时的空指针问题解决
空指针通常是因为链式调用里的中间对象没被正确Mock——比如调用a().b(param).c()时,a()返回的对象是null,或者b(param)没针对不同参数设置对应的Mock返回,后续调用直接触发NPE。下面是具体的解决步骤和示例:
核心解决思路
- 先Mock所有中间对象:链式调用里的每一层返回对象都要提前Mock,不能依赖Mockito的默认null返回。
- 按中间方法参数设置差异化返回:针对中间方法的不同参数,绑定不同的Mock对象,再给这些对象设置最终返回值。
具体代码示例
假设业务代码是这样的链式调用:
// 业务代码结构 public class BizService { public String getFinalValue(ApiClient client) { // 链式调用:client.getConfig().getItem("param").getValue() return client.getConfig().getItem("param").getValue(); } }
现在要根据getItem的不同参数返回不同的value,正确的Mock写法:
// 1. Mock所有层级的对象 ApiClient clientMock = Mockito.mock(ApiClient.class); Config configMock = Mockito.mock(Config.class); Item itemMockForParamA = Mockito.mock(Item.class); Item itemMockForParamB = Mockito.mock(Item.class); // 2. 搭建基础链式结构,确保中间调用不返回null Mockito.when(clientMock.getConfig()).thenReturn(configMock); // 3. 针对中间方法getItem的不同参数,返回不同的Item Mock对象 Mockito.when(configMock.getItem(Mockito.eq("paramA"))).thenReturn(itemMockForParamA); Mockito.when(configMock.getItem(Mockito.eq("paramB"))).thenReturn(itemMockForParamB); // 4. 给不同的Item Mock设置最终返回值 Mockito.when(itemMockForParamA.getValue()).thenReturn("resultA"); Mockito.when(itemMockForParamB.getValue()).thenReturn("resultB"); // 测试验证 BizService service = new BizService(); assertEquals("resultA", service.getFinalValue(clientMock)); // 对应paramA的场景 assertEquals("resultB", service.getFinalValue(clientMock)); // 对应paramB的场景
容易踩的坑
- 漏Mock中间对象:比如直接写
Mockito.when(clientMock.getConfig().getItem("paramA")),此时clientMock.getConfig()默认返回null,调用getItem直接触发NPE。 - 参数匹配不准确:如果用
Mockito.any()覆盖所有参数,会导致无法区分不同参数的场景,达不到差异化返回的目的。 - 深链式遗漏层级:如果是多层链式(比如
a().b().c().d()),每一层的返回对象都要单独Mock,不能跳过任何一层。
内容的提问来源于stack exchange,提问作者crazy-debug
相关产品推荐
相关产品推荐

