Mockito +捕获参数 - >多次检索相同的对象

时间:2018-01-11 12:00:36

标签: java spring mockito

我使用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);

有什么想法吗?

1 个答案:

答案 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);
    }
});