我使用spring-cloud-stream作为RabbitMQ的包装器。
在我的项目中,我需要使用MANUAL ACK。所以当我打开应用程序时,我添加了适当的配置/代码并且工作。传递消息并从消费者发回ACK。
@StreamListener(target = Sink.INPUT)
public void foo(@Payload String message,
@Header(AmqpHeaders.CHANNEL) Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) throws IOException {
service.bar(message);
channel.basicAck(deliveryTag, false);
}
问题是:
我能够为AUTO ACK编写测试但是如何为MANUAL ACK编写它?我只是不知道如何在我的测试中通过 @Header(AmqpHeaders.CHANNEL) Channel channel
?
答案 0 :(得分:0)
好的,我想我已经弄清楚如何使用mockito:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class FooTest {
@Autowired
private Sink sink;
@MockBean
private BarService barService;
@Test
public void hello() throws Exception {
//given
Channel channel = mock(Channel.class);
HashMap<String, Object> attributes = new HashMap<>();
attributes.put(AmqpHeaders.CHANNEL, channel);
attributes.put(AmqpHeaders.DELIVERY_TAG, 1);
//when
sink.input().send(MessageBuilder.createMessage("test-message", new MessageHeaders(attributes)));
//then
verify(barService).bar("test-message");
verify(channel).basicAck(1, false);
}
}
但也许有人知道是否有可能的做法而不会在标题中嘲笑Channel
?
答案 1 :(得分:0)
对于侦听器方法的单元测试,您可以直接使用mock
调用它foo("test-message", channel, 1L);
发送消息也可以测试基础结构,例如,如果您依赖于框架的消息转换(即发送JSON并具有POJO @Payload
参数。