为JMS创建JUNIT测试,以测试是否在JMS.ConvertAndSend()之后调用MessageListener onMessage()方法

发布于 2025-01-31 06:01:28 字数 5178 浏览 8 评论 0原文

我正在尝试为onMessage() MessageListener 组件类创建一个单元测试。此onMessage()方法用@jmslistener

junit test onMessagesHouldReceiveMessageOnjMssend()我创建的如果message> message> message正在收到onMessage(消息消息)的参数来自 javax.jms.message 的参数。换句话说,当消息不是null时,onMessage()被调用时。

Messagelistener.java

package com.myapp.listener;

import java.io.IOException;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.xml.transform.TransformerConfigurationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import com.myapp.service.MessageTransformService;

@Component
public class MessageListener {

    @Autowired
    private MessageTransformService messageService;

    @JmsListener(destination = "MY.QUEUE.DEV")
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                String xmlMessage = ((TextMessage) message).getText();
                messageService.transformMessageToOldSchema(xmlMessage);
            } catch (JMSException | TransformerConfigurationException | IOException e) {
                LOGGER.error(e.getMessage());
            }
        } else {
            throw new IllegalArgumentException("Message Error");
        }
    }
}

下面,我创建了 MessagelistenertestContextConfiguration 类,我在 Messagelistenertest.java 中导入,使用@Import> @import({MessageListEnertEntEtEnertEnTESTENETENETENTESTENETENTESTENTESTESTCONTEXTCONFIGURASS.CLASS.CLASS}} )

messagelistenertestContextConfiguration.java

package com.myapp.testconfig;

import javax.jms.ConnectionFactory;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.core.JmsTemplate;

@TestConfiguration
@EnableJms
public class MessageListenerTestContextConfiguration {

    @Bean
    public ConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
        return activeMQConnectionFactory;
    }

    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(connectionFactory());
        return jmsTemplate;
    }
    
}

Messagelistenertest.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import javax.jms.Message;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import com.myapp.config.AppConfig;
import com.myapp.config.MessageListenerTestContextConfiguration;
import com.myapp.listener.MessageListener;

@RunWith(SpringRunner.class)
@Import({ MessageListenerTestContextConfiguration.class })
public class MessageListenerTest {

    @Autowired
    private JmsTemplate jmsTemplate;

    @MockBean
    private MessageListener messageListener;
    
    @Test
    public void onMessageShouldReceiveMessageOnJMSSend() {
        jmsTemplate.convertAndSend("MY.QUEUE.DEV", "Test Message");
        Message msg = mock(Message.class);
        verify(messageListener, times(1)).onMessage(msg); //this is line 42 mentioned in console message
    }
}

当我运行测试方法onMessageShouldReceIveMessageOnjmsSend()

- >在Messagelistenertest.onmessageshouldreceivemessageonjmssend(Messagelistenertest.java:42) 实际上,与此模拟的相互作用为零。

从控制台上的消息中,它看起来不像onMessage() messagelistener 类中调用,我将消息发送给jmstemplate.convertsend() /code>

控制台消息指向以下线:验证(MessageListener,times(1))

。 src/main/resources 和 src/test/resources ,我有以下

application.properties

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin

我也可以看到,ActiveMQ正在运行和活动。

我感谢任何评论。

谢谢。

I am trying to create a Unit test for onMessage() method of a MessageListener component class. This onMessage() method was annotated with @JmsListener

The JUnit Test onMessageShouldReceiveMessageOnJMSSend() I created should pass if Message argument of onMessage(Message message) from javax.jms.Message is being received. In other words, when message is not null and when onMessage() is called.

MessageListener.java

package com.myapp.listener;

import java.io.IOException;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.xml.transform.TransformerConfigurationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import com.myapp.service.MessageTransformService;

@Component
public class MessageListener {

    @Autowired
    private MessageTransformService messageService;

    @JmsListener(destination = "MY.QUEUE.DEV")
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                String xmlMessage = ((TextMessage) message).getText();
                messageService.transformMessageToOldSchema(xmlMessage);
            } catch (JMSException | TransformerConfigurationException | IOException e) {
                LOGGER.error(e.getMessage());
            }
        } else {
            throw new IllegalArgumentException("Message Error");
        }
    }
}

Below, I created a MessageListenerTestContextConfiguration class which I imported in MessageListenerTest.java using @Import({ MessageListenerTestContextConfiguration.class })

MessageListenerTestContextConfiguration.java

package com.myapp.testconfig;

import javax.jms.ConnectionFactory;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.core.JmsTemplate;

@TestConfiguration
@EnableJms
public class MessageListenerTestContextConfiguration {

    @Bean
    public ConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
        return activeMQConnectionFactory;
    }

    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(connectionFactory());
        return jmsTemplate;
    }
    
}

MessageListenerTest.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import javax.jms.Message;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import com.myapp.config.AppConfig;
import com.myapp.config.MessageListenerTestContextConfiguration;
import com.myapp.listener.MessageListener;

@RunWith(SpringRunner.class)
@Import({ MessageListenerTestContextConfiguration.class })
public class MessageListenerTest {

    @Autowired
    private JmsTemplate jmsTemplate;

    @MockBean
    private MessageListener messageListener;
    
    @Test
    public void onMessageShouldReceiveMessageOnJMSSend() {
        jmsTemplate.convertAndSend("MY.QUEUE.DEV", "Test Message");
        Message msg = mock(Message.class);
        verify(messageListener, times(1)).onMessage(msg); //this is line 42 mentioned in console message
    }
}

When I run the test method onMessageShouldReceiveMessageOnJMSSend(), it says

-> at MessageListenerTest.onMessageShouldReceiveMessageOnJMSSend(MessageListenerTest.java:42)
Actually, there were zero interactions with this mock.

From the message on console, it doesn't look like onMessage() is being invoked from MessageListener class after I send a message with jmsTemplate.convertAndSend()

The console message points to this line : verify(messageListener, times(1)).onMessage(msg);

In my application.properties on both src/main/resources and src/test/resources, I have the following

application.properties

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin

I can also see, activemq is running and active.

I'd appreciate any comments.

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

澜川若宁 2025-02-07 06:01:28
  1. 您进行的验证太快了;您需要以某种方式等待收到消息(例如,通过注入模拟messagetransformservice来计算闩锁,并在测试中等待它)。

  2. 这将永远无法使用...

     消息msg =模拟(message.class);
     验证(MessageListener,Times(1))。onMessage(msg);
     

听众永远不会收到该模拟消息,使用onMessage(any(Any())而不是(或使用grigent> grigent congector捕获接收到的实际消息,因此您可以测试其属性。

  1. You are doing the verification too quickly; you need to somehow wait until the message has been received (e.g. by injecting a mock MessageTransformService that counts down a latch, and wait for it in your test).

  2. This will never work...

     Message msg = mock(Message.class);
     verify(messageListener, times(1)).onMessage(msg);
    

The listener will never receive that mock message, use onMessage(any()) instead (or use an ArgumentCaptor to capture the actual message received, so you can test its properties.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文