为JMS创建JUNIT测试,以测试是否在JMS.ConvertAndSend()之后调用MessageListener onMessage()方法
我正在尝试为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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您进行的验证太快了;您需要以某种方式等待收到消息(例如,通过注入模拟
messagetransformservice
来计算闩锁,并在测试中等待它)。这将永远无法使用...
听众永远不会收到该模拟消息,使用
onMessage(any(Any())
而不是(或使用grigent> grigent congector
捕获接收到的实际消息,因此您可以测试其属性。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).This will never work...
The listener will never receive that mock message, use
onMessage(any())
instead (or use anArgumentCaptor
to capture the actual message received, so you can test its properties.