我使用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是singleton,mock在上下文XML中定义,如
<bean id="mockedJavaMailSender" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="org.springframework.mail.javamail.JavaMailSender"/>
</bean>
创建mimemessage:
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, false, "utf-8");
helper.setSubject(emailSendingTask.getSubject());
helper.setFrom(Constants.MAIL_FROM);
有什么想法吗?
答案 0 :(得分:2)
我在我的测试类中有以下内容,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);
}
});