我正在模拟一个名为EmailSender的类,它有一个方法sendEmail(),该方法接受类Email的参数。我试图验证我的mockEmailSender将调用sendEmail函数一次与预期的电子邮件类,如:verify(mockEmailSender, times(1)).sendEmail(expectedEmail)
class Email {
String title;
List<String> receipients;
String body;
}
我正在初始化预期的电子邮件对象,如下Email expectedEmail = Email.builder().setRecipients(//example list).setTitle("Test title").setBody(// really long text)
然而,有一个警告。我还想添加一系列测试,在这些测试中,我不想验证sendEmail是否使用确切的expectedEmail
调用。我希望有一系列测试,其中每个测试只检查body字段中是否存在某个子字符串。例如,如果Body字段是"Test email body"
,我想要一个测试来验证sendEmail()
是用expectedEmail参数调用的,其中Body字段包含子字符串"Test"
,而不是具体地验证Body字段必须等于"Test email body"
,同时仍然确保title
和receipient
与我设置的完全相等。我如何在Mockito中做到这一点?
您需要使用ArgumentCaptor,如下所示:
ArgumentCaptor<Email> emailCaptor =
ArgumentCaptor.forClass(Email.class);
verify(classNameObject, times(1)).sendEmail(emailCaptor.capture());
assertThat(emailCaptor.getValue().getBody())....
请记住classNameObject
是包含sendEmail
方法的类的实例。有了这个,你现在可以在Email body属性中断言任何你想要的东西。