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

Mockito如何校验sendEmail入参Email的body含指定子串且其余字段完全匹配

Mockito校验EmailSender入参部分字段匹配的实现方法

你可以通过以下两种常用方案实现需求:

方案1:使用argThat自定义参数匹配器

直接在verify的入参位置定义匹配规则,适合轻量校验场景:

import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

// 提前定义好的固定预期值
String expectedTitle = "Test title";
List<String> expectedReceipients = List.of("xxx@example.com", "yyy@example.com");
String needContainSubstr = "Test";

verify(mockEmailSender, times(1)).sendEmail(argThat(email -> 
    email != null
    // title完全匹配
    && expectedTitle.equals(email.getTitle())
    // 收件人列表完全匹配
    && expectedReceipients.equals(email.getReceipients())
    // body包含指定子串
    && email.getBody() != null && email.getBody().contains(needContainSubstr)
));

如果多个测试需要复用匹配逻辑,可以单独封装成匹配器类:

import org.mockito.ArgumentMatcher;
import java.util.Objects;

public class EmailPartialMatcher implements ArgumentMatcher<Email> {
    private final String expectedTitle;
    private final List<String> expectedReceipients;
    private final String bodyContainSubstr;

    public EmailPartialMatcher(String expectedTitle, List<String> expectedReceipients, String bodyContainSubstr) {
        this.expectedTitle = expectedTitle;
        this.expectedReceipients = expectedReceipients;
        this.bodyContainSubstr = bodyContainSubstr;
    }

    @Override
    public boolean matches(Email email) {
        if (email == null) return false;
        return Objects.equals(expectedTitle, email.getTitle())
                && Objects.equals(expectedReceipients, email.getReceipients())
                && email.getBody() != null && email.getBody().contains(bodyContainSubstr);
    }
}

使用时直接传入对应参数即可:

verify(mockEmailSender, times(1)).sendEmail(argThat(new EmailPartialMatcher(expectedTitle, expectedReceipients, "Test")));

方案2:使用ArgumentCaptor捕获参数后校验

先捕获实际调用时传入的Email实例,再逐个字段做断言,错误提示更清晰,适合需要明确知道哪个字段不匹配的场景:

import static org.mockito.ArgumentCaptor.forClass;
import static org.mockito.Mockito.verify;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

// 定义Email类型的参数捕获器
ArgumentCaptor<Email> emailCaptor = forClass(Email.class);
// 捕获sendEmail调用的入参
verify(mockEmailSender, times(1)).sendEmail(emailCaptor.capture());
// 拿到实际传入的Email对象
Email actualEmail = emailCaptor.getValue();

// 逐个字段校验
assertEquals(expectedTitle, actualEmail.getTitle());
assertEquals(expectedReceipients, actualEmail.getReceipients());
assertTrue(actualEmail.getBody().contains("Test"));

注意:需要保证Email类存在对应字段的getter方法,否则无法读取字段值完成校验。

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

相关产品推荐
方舟 Agent Plan

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

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