>我使用 Mockito 并使用 ArgumentCaptor 捕获参数,如下所示
ArgumentCaptor<MimeMessage> captorMimeMessages = ArgumentCaptor.forClass(MimeMessage.class);
verify(mockedJavaMailSender, times(4)).send(captorMimeMessages.capture());
assertEquals("blabla", captorMimeMessages.getAllValues().get(0).getSubject());
assertEquals("blabla", captorMimeMessages.getAllValues().get(1).getSubject());
etc.
我调试了它,javaMailSender 被调用了四次不同的对象(和不同的主题值(,但是当我在测试结束时写入 4 个主题值(如 System.out.println(captorMimeMessages.getAllValues().get(X).getSubject())
(时,我看到相同的(它是最后一个方法调用的主题(主题值 4 次。
记得我之前用过它,它奏效了。我使用Spring,javaMailSender是单例的,模拟是在上下文XML中定义的,就像
<bean id="mockedJavaMailSender" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="org.springframework.mail.javamail.JavaMailSender"/>
</bean>
模仿消息创建:
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, false, "utf-8");
helper.setSubject(emailSendingTask.getSubject());
helper.setFrom(Constants.MAIL_FROM);
知道吗?
我的测试类中有以下内容,MimeMessage 只创建了一次,当我在模拟的 javaMailSender 上调用 createMimeMessage(( 时,检索了相同的实例:
when(mockedJavaMailSender.createMimeMessage()).thenReturn(new MimeMessage(session));
相反,我需要以下内容:
when(mockedJavaMailSender.createMimeMessage()).then(new Answer<MimeMessage>() {
public MimeMessage answer(InvocationOnMock invocation) throws Throwable {
return new MimeMessage(session);
}
});