gpt4 book ai didi

java - 使用 Mockito 和 JUnit 将 RabbitTemplate#convertAndSend 测试为 lambda

转载 作者:行者123 更新时间:2023-11-30 06:01:33 30 4
gpt4 key购买 nike

我正在尝试测试 RabbitTemplate#convertAndSend编写为 lambda 的方法,如下所示:

// other stuff omitted for brevity

rabbitTemplate.convertAndSend(myQueue, jsonString, message -> {
message.getMessageProperties().setPriority(priority);
return message;
});

// other stuff omitted for brevity

我尝试执行的测试用例是使用 ArgumentCaptor 来验证是否使用正确的参数调用该方法。

@Test
public void givenMyNotification_whenElementIsSent_thenSetPriorityAndSendValidParameters() {

final ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
final int expectedPriority = 5;
final Notification expected = TestUtils.getNotification();

testClass.handleNotification(expected);

verify(rabbitTemplate).convertAndSend(captor.capture(), captor.capture(),
ArgumentMatchers.eq(MessagePostProcessor.class));

// assertThat...
));

}

由于参数不同,测试在验证步骤失败。

Wanted:
<Capturing argument>,
<Capturing argument>,
interface org.springframework.amqp.core.MessagePostProcessor

Actual invocation:
"myQueue",
"myJson",
com.example.notification.service.NotificationService$$Lambda$5/73698537@5bda80bf

我尝试了mockito和hamcrest的其他几个匹配器,但没有成功。

所以,我的问题是:

  1. 如何测试这种东西?

  2. 这是否是一个好的做法,或者是否有其他/更好的方法来测试兔子模板发送?

最佳答案

除了最后一个匹配器 ArgumentMatchers.eq(MessagePostProcessor.class) 之外,您几乎一切顺利。

您实际上要求Mockito相等性与参数的类相匹配。你应该匹配:

  • 使用 ArgumentMatchers.any(MessagePostProcessor.class) 的参数类型
  • 或者实际值ArgumentMatchers.eq(expectedMessageProcessor)(如果您碰巧有的话)
  • 或者参数捕获器(如果您确实需要检查参数的值)

但是,在这种特殊情况下,如果您使用第一个选项,则可能会遇到编译器问题,因为 RabbitTemplate 类有两个类似的方法:

  • convertAndSend(字符串、字符串、对象)
  • convertAndSend(字符串、对象、MessagePostProcessor)

要解决此问题,您可以将第二个参数的类型强制为对象,如下所示:

Mockito.verify(rabbitTemplate).convertAndSend(captor.capture(), (Object) captor.capture(),
Mockito.any(MessagePostProcessor.class));

或者更好的是,为两个不同的参数设置两个不同的 ArgumentCaptor:

ArgumentCaptor<String> routingKeyCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<Object> messageCaptor = ArgumentCaptor.forClass(Object.class);

...

verify(rabbitTemplate).convertAndSend(routingKeyCaptor.capture(), messageCaptor.capture(), any(MessagePostProcessor.class));

希望这有帮助!

关于java - 使用 Mockito 和 JUnit 将 RabbitTemplate#convertAndSend 测试为 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191857/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com