编写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
相关产品推荐
相关产品推荐

