Mockito调用verify校验方法入参时如何忽略Email类的指定字段
Mockito入参部分字段校验实现方案
以下是两种常用的无侵入实现方式:
方案1:使用ArgumentCaptor捕获参数后手动校验(推荐)
这种方式调试方便、逻辑直观,是最常用的实现方案:
- 第一步:定义Email类型的参数捕获器
ArgumentCaptor<Email> emailCaptor = ArgumentCaptor.forClass(Email.class); - 第二步:执行verify逻辑,用捕获器接收实际入参
verify(mockEmailSender, times(1)).sendEmail(emailCaptor.capture()); - 第三步:取出实际调用的入参,仅校验指定字段
Email actualEmail = emailCaptor.getValue(); // 仅校验你显式设置的title、receipients字段 assertEquals(expectedEmail.getTitle(), actualEmail.getTitle()); assertEquals(expectedEmail.getReceipients(), actualEmail.getReceipients()); // body字段不需要校验,无需添加对应断言即可自动忽略
方案2:使用自定义ArgumentMatcher匹配
如果你希望把匹配逻辑封装起来复用,可以用自定义参数匹配器实现:
- 方式2.1 单独定义匹配器类
import org.mockito.ArgumentMatcher; import java.util.Objects; public class EmailPartialMatcher extends ArgumentMatcher<Email> { private final Email expectedEmail; public EmailPartialMatcher(Email expectedEmail) { this.expectedEmail = expectedEmail; } @Override public boolean matches(Object actual) { if (!(actual instanceof Email)) { return false; } Email actualEmail = (Email) actual; // 仅对比需要校验的字段 return Objects.equals(expectedEmail.getTitle(), actualEmail.getTitle()) && Objects.equals(expectedEmail.getReceipients(), actualEmail.getReceipients()); } }
然后在verify时使用匹配器:verify(mockEmailSender, times(1)).sendEmail(argThat(new EmailPartialMatcher(expectedEmail)));
- 方式2.2 Lambda简化写法(Mockito 2.1.0+版本支持)
不需要单独定义匹配器类,直接在verify时写匹配逻辑即可:
verify(mockEmailSender, times(1)).sendEmail(argThat(actualEmail -> Objects.equals(expectedEmail.getTitle(), actualEmail.getTitle()) && Objects.equals(expectedEmail.getReceipients(), actualEmail.getReceipients()) ));
不推荐的实现方式
不要为了这个需求重写Email类的equals方法排除body字段,这种方式会侵入业务代码,可能影响其他业务逻辑中equals方法的正常使用。
内容的提问来源于stack exchange,提问作者tigoa
相关产品推荐
相关产品推荐

