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

3

我使用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())),我看到相同的主题值四次(即最后一次方法调用的主题值)。

我记得以前使用过它并且正常工作。我使用Spring,javaMailSender是单例的,在上下文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);

有什么想法吗?

那真是奇怪。您使用的Mockito版本是哪个? - undefined
你的 MimeMessage 实例是如何产生的?是通过 new 操作符还是通过像 when(someMock.createObject()).thenReturn(<MimeMessage instance>) 这样的模拟对象? - undefined
很可能你的生产代码将主题存储在一个static类变量中。你的测试只是在展示失败... - undefined
pvpkiran:我使用mockito 1.10.19。Nikolay:我更新了票据,说明了mimemessage的创建方式。Timothy:我有点不喜欢静态变量,我不使用它。 - undefined
1个回答

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

1
很高兴听到你解决了它。顺便说一句,在Java 8中,你的代码可以简化为when(mockedJavaMailSender.createMimeMessage()).thenAnswer(inv -> new MimeMessage(session)); - undefined
谢谢!顺便说一下,你的提示让我找到了解决办法。 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接