gpt4 book ai didi

java - 如何使 JUnit 接受任何 Lambda 表达式

转载 作者:行者123 更新时间:2023-12-02 03:28:40 25 4
gpt4 key购买 nike

我正在使用 SpringAMQP,我正在测试生产者方法(基本上是 AMQP 模板),如下所示。

public void send(Message message, Throwable error, String queue, String routingKey) {

this.amqpTemplate.convertAndSend(
RabbitConfiguration.ERROR_EXCHANGE,
RabbitConfiguration.ERROR_ROUTING_KEY,
message,
messageMetaData -> {

messageMetaData.getMessageProperties().getHeaders().put("x-death-reason", error.getMessage());

return messageMetaData;
}
);
}

我正在使用以下代码测试此代码

import static org.hamcrest.Matchers.any;
....
@Test
public void will_create_error_message_if_incorrect_payload_is_given() {

AmqpTemplate amqpTemplate = mock(AmqpTemplate.class);
Throwable throwable = mock(Throwable.class);
when(throwable.getMessage()).thenReturn("first");
when(throwable.getStackTrace()).thenReturn(null);

ErrorMessageProducer errorMessageProducer = new ErrorMessageProducer(amqpTemplate);

Message message = MessageBuilder.withBody("test".getBytes()).build();

verify(amqpTemplate).convertAndSend(
eq(RabbitConfiguration.ERROR_EXCHANGE),
eq(RabbitConfiguration.ERROR_ROUTING_KEY),
any(Message.class),
Mockito.any()
);
}

但是我收到参数匹配器的无效使用!预计有 4 个匹配者,已记录 3 个。有什么方法可以使用 Lambda 进行测试或完全忽略 Lambda。

最佳答案

问题是因为您使用了错误的any()

verify(amqpTemplate).convertAndSend(
eq(RabbitConfiguration.ERROR_EXCHANGE),
eq(RabbitConfiguration.ERROR_ROUTING_KEY),
any(Message.class),
Mockito.any()
);

这里您的第三个参数使用来自 org.hamcrest.Matchers.anyany,但是第四个参数使用正确的 Mockito.any()。因此,第三个参数没有被检测为匹配器,而是像通常的参数一样受到威胁。

要检查您的 lambda,您可能应该使用 ArgumentCaptor .

ArgumentCaptor<Runnable> argument = ArgumentCaptor.forClass(Runnable.class);
verify(mock).doSomething(any(), argument.capture());
argument.getValue().run();
...verify that lambda called your services...

您可以将Runnable更改为您的lambda实际代表的任何类型的函数:即Function/Callable

关于java - 如何使 JUnit 接受任何 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121824/

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