【发布时间】:2018-08-02 14:44:05
【问题描述】:
在使用 Spock 时,我可以执行以下操作:
when:
12.times {mailSender.send("blabla", "subject", "content")}
then:
12 * javaMailSender.send(_)
当我尝试在 Mockito 中做同样的事情时:
verify(javaMailSender,times(12)).send(any(SimpleMailMessage.class))
我收到一个错误,SimpleMailMessage 有空值,所以我必须在测试中对其进行初始化:
SimpleMailMessage simpleMailMessage = new SimpleMailMessage()
simpleMailMessage.setTo("blablabla")
simpleMailMessage.subject = "subject"
simpleMailMessage.text = "content"
verify(javaMailSender,times(12)).send(simpleMailMessage))
现在它可以工作了,但工作量很大,我真的不在乎平等。如果 SimpleMailMessage 将有更多的参数或另一个带有另一个参数的对象,嗯。有什么方法可以检查 send 方法是否被调用了 X 次?
编辑:添加了 send 方法的实现。
private fun sendEmail(recipient: String, subject: String, content: String)
{
val mailMessage = SimpleMailMessage()
mailMessage.setTo(recipient)
mailMessage.subject = subject
mailMessage.text = content
javaMailSender.send(mailMessage)
}
有 2 个发件人,mailSender 是我的自定义对象,javaMailSender 来自另一个库
堆栈跟踪:
Mockito.verify(javaMailSender,
Mockito.times(2)).send(Mockito.any(SimpleMailMessage.class))
| | | | |
| | | | null
| | | Wanted but not invoked:
| | | javaMailSender.send(
| | | <any org.springframework.mail.SimpleMailMessage>
| | | );
| | | -> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| | |
| | | However, there were exactly 2 interactions with this mock:
| | | javaMailSender.send(
| | | SimpleMailMessage: from=null; replyTo=null; to=blabla; cc=; bcc=; sentDate=null; subject=subject; text=content
| | | );
| | | -> at MailSenderServiceImpl.sendEmail(MailSenderServiceImpl.kt:42)
| | |
| | | javaMailSender.send(
| | | SimpleMailMessage: from=null; replyTo=null; to=blabla; cc=; bcc=; sentDate=null; subject=subject; text=content
| | | );
【问题讨论】:
-
send的参数是什么?在第一个示例中,您显示了三个字符串,而在第二个示例中,您有一个对象 -
参数为 SimpleMailMessage。方法 mailSender.send(String, String, String) 在内部以第二个示例中的方式初始化 SimpleMailMessage。
-
我认为该代码片段没有问题。你能否详细说明它在哪里说它有空值?
-
添加了堆栈跟踪,如您所见。它需要相等 SimpleMailMessage 但我只想检查:“方法是否被调用了 12 次?”我不关心 SimpleMailMessage 的平等
-
你能分享一个MCVE,而不是一组不连贯的sn-ps吗?例如。在您的测试中,我看不到与
mailSender.send("blabla", "subject", "content")等效的内容。顺便说一句,我删除了 spock 标记,因为这绝对不是 Spock 问题。
标签: unit-testing testing mockito stub