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

Mockito when()多参数匹配问题:含Builder参数的单元测试校验

解决方案

要同时精确匹配前两个参数并验证第三个Builder实例的内部属性,可以用以下几种方式:

1. 使用 argThat 配合Lambda表达式(快速实现)

直接在打桩时用 eq() 精确匹配前两个参数,第三个参数用 argThat() 传入自定义校验逻辑:

Mockito.when(myclass.method(eq(value1), eq(value2), argThat(builder -> {
    // 在这里编写对Builder内部属性的校验逻辑,返回true表示匹配成功
    return builder.getFieldA().equals(expectedA) &&
           builder.getFieldB() == expectedB;
}))).thenReturn(myObject);
  • eq(value1) 和 eq(value2) 确保前两个参数与预期值精确匹配
  • argThat() 中的Lambda会接收实际传入的Builder实例,你可以在这里校验它的所有关键属性是否符合预期

2. 提取自定义ArgumentMatcher(复用场景)

如果这个Builder的校验逻辑需要在多个测试用例中复用,可以单独写一个匹配器类:

class MyOtherClassBuilderMatcher implements ArgumentMatcher<MyOtherClass.Builder> {
    private final String expectedFieldA;
    private final int expectedFieldB;

    public MyOtherClassBuilderMatcher(String expectedFieldA, int expectedFieldB) {
        this.expectedFieldA = expectedFieldA;
        this.expectedFieldB = expectedFieldB;
    }

    @Override
    public boolean matches(MyOtherClass.Builder builder) {
        return builder.getFieldA().equals(expectedFieldA) &&
               builder.getFieldB() == expectedFieldB;
    }
}

使用时直接实例化这个匹配器:

Mockito.when(myclass.method(eq(value1), eq(value2), argThat(new MyOtherClassBuilderMatcher("expectedA", 123))))
       .thenReturn(myObject);

3. 验证方法调用时的参数(如果是校验调用而非打桩)

如果你的需求是验证方法被调用时的参数是否正确,而非打桩返回值,可以用 verify 配合同样的逻辑:

verify(myclass).method(eq(value1), eq(value2), argThat(builder -> {
    return builder.getFieldA().equals(expectedA);
}));

注意事项

  • 确保Builder类的属性访问方法(如getter)是可访问的,如果是私有属性,可以考虑通过反射获取,或者在测试包下开放访问权限
  • 如果Builder有复杂的构建逻辑,也可以在校验时调用build()方法,验证构建出的对象是否符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:45:28