集成测试的RabbitMQ听者 - 间歇性地失败,因为消息需要时间来排队

问题描述 投票:0回答:1

我已经写了一个集成测试使用RabbitMock以下流(发现它在GitHub上,它似乎真的很酷):

消息被添加到传入的消息队列 - >传入消息听者拾取消息 - >对其进行处理 - >把一个新的传出消息到新队列传出消息队列 - >(仅用于测试)写在SRC /测试/资源此传出队列中的听者。

一切工作(有一个重要的故障 - 间歇超时)和我做的断言,如下图所示:

List<OutgoingData> receivedMessages = new ArrayList<>();
            assertTimeoutPreemptively(ofMillis(15000L), () -> {
                    while (receivedMessages.isEmpty()) {
                        OutgoingData data = 
receiver.getOutgoingData();
                        if(data != null){
                            receivedMessages.add(data);
                        }

                    }
                }
            );

            assertThat(receivedMessages.get(0)).isNotNull();

 assertThat
(receivedMessages.get(0).getRecipient())
.isEqualTo("enabled@localhost");

在本次测试的超时是我面临的真正的问题。

  1. 由于超时,测试越来越慢。
  2. 如果我删除了超时,测试卡在詹金斯,需要强行杀死。
  3. 有时,这15000毫秒超时也不够和测试失败。

我想知道是否有更好的方式来处理与集成测试这样的情况。

期待你的投入。

非常感谢,Banyanbat

spring-rabbitmq integration-testing
1个回答
0
投票

当我给它多一点思考和跟我的团队成员之一关于这一点,点击我的注意,在java 8个期货可以在这里得到有效使用。

我实现它,如下所示和它的工作就像一个魅力。

@Test
public void basic_consume_case()
        InterruptedException, ExecutionException {
    IncomingData incomingData = new IncomingData();
    incomingData.setRecipient("enabled@localhost");
    incomingData.setSender("unblocked@localhost");
    incomingData.setStoreKey("123");
    incomingData.setSubject("Hello");
    incomingData.setText("Hello from Test 1");
    try (AnnotationConfigApplicationContext context = new 
   AnnotationConfigApplicationContext(
            ConnectionFactoryConfiguration.class)) {

        sendMessage(incomingData);

        Future<OutgoingData> receivedMessageFuture = pollOutgoingQueueForData();

        OutgoingData receivedMessage = receivedMessageFuture.get();

        assertThat(receivedMessage).isNotNull();
        assertThat(receivedMessage.getRecipient()).isEqualTo("enabled@localhost");
        assertThat(receivedMessage.getContent())
        ...

    }
}
private void sendMessage(IncomingData incomingData) {
    try {
        rabbitTemplate.convertAndSend("incoming-data-queue", incomingData, m -> {
            m.getMessageProperties().setContentType("application/json");
            return m;
        });

    } finally {
    }
}

private Future<OutgoingData> pollOutgoingQueueForData() throws InterruptedException {

    return executor.submit(() -> {
        OutgoingData receivedMessage = null;
        while (receivedMessage == null) {
            receivedMessage = (OutgoingData) 
rabbitTemplate.receiveAndConvert("outgoing-queue");
        }
        return receivedMessage;
    });

}
© www.soinside.com 2019 - 2024. All rights reserved.