gpt4 book ai didi

java - 如何在 JUnit 中等待 @JMSListener 注解的方法完成

转载 作者:行者123 更新时间:2023-11-30 08:02:07 32 4
gpt4 key购买 nike

所以我试图对基于 Spring (v4.1.6) 的代码进行 JMS 处理的一些集成测试。

这是一个非常标准的 Spring 设置,带有 @JmsListener 带注释的方法和 DefaultMessageListenerContainerconcurrency 设置为 1因此只允许 1 个监听线程。

现在,我利用 ActiveMQ 的嵌入式代理,不再依赖任何外部 jms 代理来随时随地运行测试(我应该从事营销工作)。

一切正常,然后我进行 JUnit 测试:

@Test
public void test() {
sendSomeMessage();
//how to wait here for the @JMSListener method to complete
verify();
}

我发送了消息,但随后我需要以某种方式等待 @JMSListener 带注释的方法完成。我该怎么做?

最佳答案

嗯,我希望我能以某种方式连接到消息驱动的 Pojos 生命周期来做到这一点,但是在浏览有关异步代码的其他 SO 问题时,我想出了一个基于 CountDownLatch 的解决方案。

  1. @JMSListener带注释的方法应该调用 countDown()所有工作完成后,在 CountDownLatch 上:

    @JmsListener(destination = "dest", containerFactory = "cf")
    public void processMessage(TextMessage message) throws JMSException {
    //do the actual processing
    actualProcessing(message);
    //if there's countDownLatch call the countdown.
    if(countDownLatch != null) {
    countDownLatch.countDown();
    }
    }
  2. 在测试方法中

    @Test
    public void test() throws InterruptedException {
    //initialize the countDownLatch and set in on the processing class
    CountDownLatch countDownLatch = new CountDownLatch(1);
    messageProcessor.setCountDownLatch(countDownLatch);
    //sendthemessage
    sendSomeMessage();
    //wait for the processing method to call countdown()
    countDownLatch.await();
    verify();
    }

此解决方案的缺点是您必须实际更改 @JMSListener专门用于集成测试的注释方法

关于java - 如何在 JUnit 中等待 @JMSListener 注解的方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743487/

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