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

单元测试:如何模拟Mock依赖方法向传入列表添加内容?

解决Mock方法修改传入列表的单元测试问题

你原来的写法思路错了——verify是用来验证方法是否被调用的,不是用来模拟方法行为的。要实现validateFoo向传入的errors列表添加内容的效果,得用when...thenAnswer来设置Mock对象的应答逻辑,而不是在verify里动手脚。

正确的实现步骤如下:

  1. 设置Mock的行为逻辑:当validateFoo被调用时,获取传入的errors列表并添加错误信息
// 假设fooHelperMock是你用Mockito创建的Mock实例
when(fooHelperMock.validateFoo(eq(foo), anyList())).thenAnswer(invocation -> {
    // 获取方法调用时传入的第二个参数(也就是errors列表)
    List<String> errors = invocation.getArgument(1);
    errors.add("Error message");
    return null; // 如果validateFoo是void方法,返回null即可
});
  1. 执行被测代码:调用包含fooHelper.validateFoo(foo, errors)逻辑的被测方法
// 比如你的被测对象是testService,调用它的某个方法
testService.processFoo(foo, errors);
  1. 验证结果:检查errors列表是否包含预期的错误信息
assertEquals(1, errors.size());
assertEquals("Error message", errors.get(0));

为什么原来的写法无效?

你用argThat的lambda去修改参数,本质上是在参数匹配阶段做操作——但argThat的作用是判断参数是否符合匹配条件(返回布尔值),不是用来修改参数的。而且verify是在方法调用结束后做验证,此时修改errors已经不会影响被测代码的执行结果了。

如果还需要验证validateFoo确实被调用过,可以在最后再加一句:

verify(fooHelperMock).validateFoo(eq(foo), eq(errors));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:54:58