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

