【问题标题】:Mockito verifying method invocation without using equals methodMockito 验证方法调用而不使用 equals 方法
【发布时间】: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


【解决方案1】:

如果不关心 send 的参数,请将 any() 留空:

verify(javaMailSender,times(12)).send(any())

【讨论】:

  • 并在 Spock (Groovy) 中执行此操作,但它不会工作。不知道为什么:/
  • 所以你把 spock 和 mockito 结合起来了?你能提供你正在使用的模拟版本吗?我想检查一下
  • 是的,因为 Mockito(带有插件)能够模拟最终类,并且我的项目的一半是在 Kotlin 中(默认为 final)。所以当我需要模拟 Kotlin 类时,然后使用 Mockito。我有 mockito-core 2.11.0 作为依赖项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多