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

