В этой статье показано, как смоделировать инфраструктуру JMS с помощью MockRunner и протестировать ее с помощью Spring. Его легко протестировать без инфраструктуры JMS, такой как Active MQ, OpenJMS и т. Д. Инфраструктура Mockrunner упрощает JMS, пока вы внедряете JMS или пытаетесь воссоздать производственную проблему без зависимости.
В этой статье я покажу, как создать простой слушатель текстовых сообщений и отправить сообщение в очередь.
- Требования:
pom.xml зависимости
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples</groupId>
<artifactId>spring-jms-timer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- Generic properties -->
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring -->
<spring-framework.version>3.2.3.RELEASE</spring-framework.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Test Artifacts -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${springframework.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
<version>1.1</version>
</dependency>
<!-- mockrunner -->
<dependency>
<groupId>com.mockrunner</groupId>
<artifactId>mockrunner-jms</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
</project>
Файл конфигурации Spring Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms-3.0.xsd">
<!-- mockrunner -->
<bean id="destinationManager" class="com.mockrunner.jms.DestinationManager"/>
<bean id="mockQueue" factory-bean="destinationManager" factory-method="createQueue">
<constructor-arg index="0" value="demoMockRunnerQueue" />
</bean>
<bean id="configurationManager" class="com.mockrunner.jms.ConfigurationManager"/>
<bean id="jmsQueueConnectionFactory" class="com.mockrunner.mock.jms.MockQueueConnectionFactory">
<constructor-arg index="0" ref="destinationManager" />
<constructor-arg index="1" ref="configurationManager" />
</bean>
<!-- spring -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsQueueConnectionFactory" />
</bean>
<jms:listener-container connection-factory="jmsQueueConnectionFactory" >
<jms:listener destination="demoMockRunnerQueue" ref="employeeMessageListener" method="onMessage" />
</jms:listener-container>
<bean id="employeeMessageListener" class="com.jms.timer.demo.EmployeeMessageListener" />
</beans>
EmployeeMessageListener.java
package com.jms.timer.demo;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.jms.listener.SessionAwareMessageListener;
public class EmployeeMessageListener implements SessionAwareMessageListener<TextMessage>{
@Override
public void onMessage(TextMessage textMessage, Session session) throws JMSException {
System.out.println("Message Received "+textMessage.getText());
}
}
Испытание пружины
package com.jms.timer.demo;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.mockrunner.mock.jms.MockQueue;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext-mockrunner.xml")
public class MockRunnerJmsSenderTest {
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private MockQueue mockQueue;
@Test
public void shouldSendMessage()
{
jmsTemplate.send(mockQueue, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText("This is test message from MockRunner");
return message;
}
});
}
}
вывод:
26 сентября 2014 13:00:34 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
ИНФОРМАЦИЯ: Загрузка определений XML-бинов из ресурса пути к классу [com / jms / timer / demo / applicationContext-mockrunner.xml]
26 сентября 2014 г., 13:00:35 org.springframework.context.support.AbstractApplicationContext prepareRefresh
ИНФОРМАЦИЯ: Обновление org.springframework.context.support.GenericApplicationContext@77383942: дата запуска [пт, сент. 26 13:00:35 CDT 2014]; корень контекстной иерархии
26 сентября 2014 13:00:35 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
ИНФОРМАЦИЯ: Предварительные экземпляры синглетов в org.springframework.beans.factory.support.DefaultListableBeanFactory@302abefe: определение bean-компонентов [destinationManager, mockQueue, configurationManager, jmsQueueConnectionFactory, jmsTemplate, OrworkLerMessageMesserMergMesserMerg.MesserMerg.mef. springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor] ; корень фабричной иерархии
26 сентября 2014 г., 13:00:35 org.springframework.context.support.DefaultLifecycleProcessor $ LifecycleGroup start
ИНФОРМАЦИЯ: Запуск бобов в фазе 2147483647
Сообщение получено Это тестовое сообщение от MockRunner