【问题标题】:Using Mockito doAnswer in Kotlin在 Kotlin 中使用 Mockito doAnswer
【发布时间】:2017-05-19 09:58:29
【问题描述】:

与这段 Java 代码等效的 Kotlin 是什么?

doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        Design design = new Design();
        GetDesign.Listener callback = (GetDesign.Listener) invocation.getArguments()[0];
        callback.onSuccess(design);
        return null;
    }
}).when(someRepository).getDesign(any(GetDesign.Listener.class));

[更新] 在尝试了几个选项后,我终于使用mockito-kotlin 使它工作。我认为这是实现doAnswer 的最舒适的方式。语法几乎保持不变:

doAnswer {
    callback = it.arguments[0] as GetDesign.Listener
    callback.onSuccess(Design())
    null
}.whenever(someRepository).execute(any(GetDesign.Listener::class.java))

完整的代码和build.gradle配置可以找到here

【问题讨论】:

  • 注意:我建议查看这些 Kotlin Mockito 绑定:github.com/nhaarman/mockito-kotlin。他们给你一堆很酷的东西(例如whenever而不是`when`)。
  • 我看过了,但它适用于 Kotlin 1.1.1 吗?
  • 我猜您需要进行 SAM 转换。见这里:kotlinlang.org/docs/reference/java-interop.html#sam-conversions
  • 在我的机器上工作:)
  • 使用 mockito-kotlin 让它也能工作。试图让它以“原始方式”工作,一旦我得出一些结论,就会更新答案

标签: testing mockito kotlin


【解决方案1】:
doAnswer {
    val design = Design()

    val callback = it.arguments[0] as GetDesign.Listener
    callback.onSuccess(design)

    null // or you can type return@doAnswer null

}.`when`(someRepository).getDesign(any(GetDesign.Listener::class.java))

【讨论】:

  • @voghDev 如果此答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
  • 确实是正确的答案。我会用任何时候替换when,因为mockito-kotlin 添加了这个看起来更干净的函数。我还将更新问题文本。谢谢
【解决方案2】:

我是 Full Mocking 对象的粉丝,我不想加载任何配置或任何其他 Spring Boot 依赖注入。

如果我必须模拟一个 JavaMailSender 函数,我会这样做。我将使用theAnswer 来返回值。

Kotlin(仅测试 JavaMailSender)

@Test
fun javaMailSenderTest(){
val jms = mock(JavaMailSender::class.java)
val mimeMessage = mock(MimeMessage::class.java)
mimeMessage.setFrom("no-reply@example.com")
mimeMessage.setText("Just a body text")

Mockito.`when`(jms.send(mimeMessage)).thenAnswer {
  // val callback = it.arguments[0]  <- Use these expression to get params values
  // Since JavaMailSender::send() function retrun void therefore, we should return Unit
  Unit
}

assertEquals(jms.send(mimeMessage), Unit)

}

Kotlin(为 JavaMailSender 使用自定义类)

您可能正在使用自己的自定义类来发送邮件,所以我在这里完成了。

@Test
fun updateMembers&SendEmailTest() {

val mockEmailService= mock(MyEmailServiceImplementor::class.java)

// sendInfoMail(true|false) is my custom implemention of JavaMailSender
Mockito.`when`(mockEmailService.sendInfoMail(true)).thenAnswer { invocation ->
  Unit
}

assertEquals(mockEmailService.sendInfoMail(true), Unit)

}

希望这对某人有所帮助。如果您需要 Java 版本,请在 cmets 中告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多