如何在Spring Stream中测试MANUAL ACK - RabbitMQ

时间:2017-11-19 00:06:01

标签: spring-cloud-stream

我使用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

2 个答案:

答案 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参数。