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

编写Mockito单元测试时如何初始化被测方法依赖的Map数据?

问题根因

你测试类中cartRecords是Mockito创建的Mock对象,未对cartRecords.getRecords()方法配置返回值。Mock对象的方法默认返回对应类型的缺省值(Map属于引用类型,默认返回null)。被测方法checkAvailable拿到的records是null,遍历逻辑根本没有执行,因此goodsService不会产生任何交互。

修复方案

在checkAvailableTest测试方法中,构造完自定义的recordsMap后,为cartRecords.getRecords()方法添加打桩配置,指定返回你构造的Map即可。

修改后的测试代码

@Test
public void checkAvailableTest() {
    Map<Long, Long> records = new HashMap<>(Map.of(1L, 2L, 2L, 2L));
    // 新增以下打桩代码
    Mockito.when(cartRecords.getRecords()).thenReturn(records);

    Mockito.when(goodsService.enoughQuantity(any(CartAdditionDTO.class))).thenReturn(true);

    Assertions.assertTrue(cartRecordService.checkAvailable());

    verify(goodsService, times(2)).enoughQuantity(any(CartAdditionDTO.class));
}

额外注意点

  • Mock对象的所有方法调用如果需要非默认返回值,必须提前通过Mockito.when配置打桩规则,否则会返回对应类型的默认值:引用类型返回null、基本数值类型返回0、布尔类型返回false等
  • 如果你的业务逻辑中存在对cartRecords.getRecords()返回值的判空处理,未打桩时不会触发空指针,只会直接跳过遍历逻辑,这也是你当前只报无交互、没有抛空指针异常的原因

内容的提问来源于stack exchange,提问作者Fedor Nikolaev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:02