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

Mockito测试CartRecordService时出现UnsupportedOperationException求助

错误原因
  • 测试代码中使用Map.of(2L,2L)作为cartRecords.getRecords()的返回值,JDK9及以上版本中Map.of()方法生成的是不可变Map实例,不支持put、remove等修改集合结构的操作,因此业务代码执行cartRecords.getRecords().put(...)时触发UnsupportedOperationException。
修复方案

方案1:修改Mock返回值为可变Map(快速修复)

将测试类中cartRecords.getRecords()的Mock返回值改为可变的HashMap即可,修改后的测试代码如下:

@Test
public void enougthGoodsToAddRecordNew(){
    CartAdditionDTO cartAdditionDTO = new CartAdditionDTO(1L, 15L);

    Mockito.when(goodsService.enoughQuantity(cartAdditionDTO)).thenReturn(true);
    // 将不可变的Map.of返回值包装为可变HashMap
    Mockito.when(cartRecords.getRecords()).thenReturn(new HashMap<>(Map.of(2L,2L)));

    Assertions.assertTrue(cartRecordService.addRecord(cartAdditionDTO));

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

方案2:优化业务代码封装(推荐)

当前业务代码直接修改cartRecords.getRecords()返回的内部集合,不符合封装原则,内部状态直接暴露给外部易引发意料之外的修改。可以给CartRecord类新增新增元素的专用方法,内部处理集合修改逻辑,测试时仅需Mock该方法的行为即可,无需关注内部集合的实现细节。

内容的提问来源于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 08:24:07