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

