当前位置: 首页 > 面试题库 >

如何在JUnit中等待@JMSListener注释方法完成

潘意
2023-03-14
问题内容

因此,我试图对基于Spring(v4.1.6)的JMS处理进行一些集成测试。

这是一个非常标准的Spring设置,带有带@JmsListener注释的方法,DefaultMessageListenerContainer带有的concurrency设置为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();
        }
    }
  1. 在testMethod中
        @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针对集成测试专门更改带注释的方法



 类似资料:
  • 我正在编写一个WinForms应用程序,它将数据传输到USB HID类设备。我的应用程序使用了优秀的通用HID库V6.0,可以在这里找到。简单来说,当我需要向设备写入数据时,这是被调用的代码: 当我的代码退出while循环时,我需要从设备中读取一些数据。但是,设备无法立即响应,因此我需要等待此呼叫返回后再继续。由于当前存在,RequestToGetInputReport()声明如下: GetInp

  • 问题内容: 我想编写一个后台作业(EJB 3.1),该作业每分钟执行一次。为此,我使用以下注释: 工作正常。 但是,有时该工作可能需要一分钟以上。在这种情况下,计时器仍会触发,从而导致线程问题。 如果当前执行未完成,是否可以终止调度程序? 问题答案: 如果可能只有一个计时器同时处于活动状态,则有两种解决方案。 首先,应该在。在Singleton中,方法默认情况下是写锁定的,因此,当容器中仍有活动时

  • 我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。 a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成 C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。 我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。 列表sendGet(字符串url,map 正文){

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环

  • 问题内容: 我在测试中使用Wiremock,并具有以下代码行: 我想切换到Junit5。因此,我添加了下一个依赖项(使用gradle): 但是当我尝试导入@Rule注释时没有任何建议。我是否需要添加另一个junit依赖模块?还是Junit5不支持规则?如果没有,我该如何替换@Rule批注以使测试再次起作用?谢谢。 问题答案: 从总体上看,你做了什么和JUnit 4中应该做和该关联提供的JUnit

  • 问题内容: 有时我需要等待一种方法完成,主要是在“加载程序”功能上。这是我这样做的方式: 我忍不住觉得这不是等待a 完成的最佳方法。做这个的最好方式是什么? 问题答案: 如果内没有 异步 代码, 则不是异步代码,例如以下代码: 完成后,您将看到警报。 否则(您内部有异步的东西),可以将循环包装在Promise中: 信用:@ rolando-benjamin-vaz-ferreira