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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:04