将 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容器
- 发送消息
我们想为使用 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容器
- 发送消息