Статьи

MockRunner с модульным тестом JMS Spring

В этой статье показано, как смоделировать инфраструктуру JMS с помощью MockRunner и протестировать ее с помощью Spring. Его легко протестировать без инфраструктуры JMS, такой как Active MQ, OpenJMS и т. Д. Инфраструктура Mockrunner упрощает JMS, пока вы внедряете JMS или пытаетесь воссоздать производственную проблему без зависимости.

 В этой статье я покажу, как создать простой слушатель текстовых сообщений и отправить сообщение в очередь. 

  1. Требования:

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