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

Mockito测试报错ArrayList cannot be returned by toString()如何修复?

问题分析与解决

错误原因

你的测试代码存在两个核心问题:

  • Mockito语法误用:@InjectMocks注入的是真实的StandardInventoryInfraService实例,而非Mock对象。Mockito的when()方法仅适用于Mock或Spy对象,对真实对象使用该语法会触发内部逻辑混乱,导致出现ArrayList cannot be returned by toString()这类类型不匹配的错误。
  • 测试逻辑偏离目标:当前代码试图Stub被测试方法本身,再验证它是否被调用,完全没有测试verifyStock的核心业务逻辑(库存校验规则是否生效)。

修正后的测试代码

正确的测试思路是:MockInventoryRepository的方法(因为verifyStock依赖的sumAvailableBySkuAndMerchantId最终会调用repository),调用真实service的verifyStock方法,然后断言返回结果是否符合预期。

假设sumAvailableBySkuAndMerchantId内部调用的是repository.sumAvailableBySkuAndMerchantId(sku, merchantId),修正后的代码如下:

@ExtendWith(MockitoExtension.class)
class StandardInventoryInfraServiceTest {

    @InjectMocks
    private StandardInventoryInfraService service;

    @Mock
    private InventoryRepository repository;

    @Test
    public void testVerifyStock() {
        // 1. 准备测试输入数据
        List<InventoryInfo> inputInventoryList = Arrays.asList(
                new InventoryInfo(1L, "product1", 2, false),
                new InventoryInfo(1L, "product2", 2, false)
        );

        // 2. Mock依赖方法的返回值,模拟库存情况
        when(repository.sumAvailableBySkuAndMerchantId("product1", 1L)).thenReturn(3); // 库存充足
        when(repository.sumAvailableBySkuAndMerchantId("product2", 1L)).thenReturn(1); // 库存不足

        // 3. 调用被测试的业务方法
        List<InventoryInfo> result = service.verifyStock(inputInventoryList);

        // 4. 断言结果符合业务规则
        assertTrue(result.get(0).isAvailable()); // product1库存充足,标记为可用
        assertFalse(result.get(1).isAvailable()); // product2库存不足,标记为不可用

        // 可选:验证repository方法被正确调用
        verify(repository, times(1)).sumAvailableBySkuAndMerchantId("product1", 1L);
        verify(repository, times(1)).sumAvailableBySkuAndMerchantId("product2", 1L);
    }
}

关键说明

  • 仅Mock被测试类的外部依赖(此处为InventoryRepository),被测试类本身使用真实实例(通过@InjectMocks注入)。
  • 测试聚焦于业务行为:输入数据后,检查输出的available属性是否符合库存校验规则。
  • 若sumAvailableBySkuAndMerchantId是service的私有方法,优先考虑将其重构为依赖组件的方法(便于Mock),而非直接测试私有方法——测试应聚焦于公开方法的行为,而非内部实现细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:50:20