将 RabbitListenerTestHarness 与 Mockk 结合使用

Using RabbitListenerTestHarness with Mockk

我们想为使用 Spring Boot 和 Spring AMQP 的项目编写测试。当我们在 Kotlin 中编码时,我们希望使用 MockK 而不是 Mockito,因为它更适合 Kotlin 代码风格和最佳实践。

RabbitListenerTestHarness class 为测试 @RabbitListener 提供了一些方便的功能。但是,它 returns 实现了 Mockito 的 Answer 接口,与 MockK 的 Answer 接口不兼容。

有没有办法将 Mockito 答案与 MockK 一起使用,例如一些现有的互操作性包装器?

考虑以下示例侦听器:

class SampleListener {
  @RabbitListener(id = "sampleReceiver", queues = ["testQueue"])
  fun receiveMessage(message: Message) {

  }
}

和实际测试:

@SpringBootTest
class SampleTest(@Autowired val template: TestRabbitTemplate) {
  @Autowired
  lateinit var testHarness: RabbitListenerTestHarness

  @Test
  fun testRabbit() {
    val spy = testHarness.getSpy<SampleListener>("sampleReceiver")
    val answer: LatchCountDownAndCallRealMethodAnswer = testHarness.getLatchAnswerFor("sampleReceiver", 1)

//    Mockito.doAnswer(answer).`when`(spy).receiveMessage(ArgumentMatchers.any())
    every { spy.receiveMessage(any()) } answers { /* what goes here? */ }

    template.convertAndSend("testQueue", "test")
  }
}

测试包含 Mockito 调用,如 Docs 中所述,作为注释。 我的问题是,如何使用从 getLatchAnswerFor 返回的答案对象来完成 MockK 存根?

完全不使用线束并在消息侦听器周围添加自己的代理可能更容易。

  • RabbitListenerEndpointRegistry
  • 获取容器
  • 从容器获取侦听器,将其包装在代理中并在容器上设置
  • stop/start容器
  • 发送消息