How to wait for @JMSListener annotated method to complete in JUnit

前端 未结 4 672
失恋的感觉
失恋的感觉 2021-01-22 03:50

So I am trying to get some integration testing of JMS processing, Spring (v4.1.6) based code.

It\'s a very standard Spring setup with @JmsListener annotate

4条回答
  •  情书的邮戳
    2021-01-22 04:25

    Well, I was hoping I can somehow hook into the Message Driven Pojos lifecycle to do this, but going through other SO questions about async code I came up with a solution based on CountDownLatch

    1. The @JMSListener annotaded method should call countDown() on a CountDownLatch after all the work is complete:

      @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. In the 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();
      }
      

    The drawback of this solution is that you have to actually change your @JMSListener annotated method specifically for the integration test

提交回复
热议问题