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

