Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

MockRunner with JMS Spring Unit Test

DZone's Guide to

MockRunner with JMS Spring Unit Test

This article shows how to mock your JMS infrastructure using MockRunner and test it using Spring.

· DevOps Zone
Free Resource

Download the blueprint that can take a company of any maturity level all the way up to enterprise-scale continuous delivery using a combination of Automic Release Automation, Automic’s 20+ years of business automation experience, and the proven tools and practices the company is already leveraging.

This article shows how to mock your JMS infrastructure using MockRunner and test it using Spring. It is easy to test without JMS infrastructure such as Active MQ, OpenJMS, etc. Mockrunner framework simplify JMS while your in stage to implement JMS or trying to re-create production issue without dependency.

 In this article I show how to create simple Text Message Listener and send a message to queue. 


  1. Requirements:




pom.xml  dependencies

<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 Configuration  file

<?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());  
   }

}

Spring Unit Test

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;
         }
      });

   }

}

 output:

Sep 26, 2014 1:00:34 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

INFO: Loading XML bean definitions from class path resource [com/jms/timer/demo/applicationContext-mockrunner.xml]

Sep 26, 2014 1:00:35 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh

INFO: Refreshing org.springframework.context.support.GenericApplicationContext@77383942: startup date [Fri Sep 26 13:00:35 CDT 2014]; root of context hierarchy

Sep 26, 2014 1:00:35 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@302abefe: defining beans [destinationManager,mockQueue,configurationManager,jmsQueueConnectionFactory,jmsTemplate,org.springframework.jms.listener.DefaultMessageListenerContainer#0,employeeMessageListener,org.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]; root of factory hierarchy

Sep 26, 2014 1:00:35 PM org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup start

INFO: Starting beans in phase 2147483647

Message Received This is test message from MockRunner

Download the ‘Practical Blueprint to Continuous Delivery’ to learn how Automic Release Automation can help you begin or continue your company’s digital transformation.

Topics:
architects ,devops

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}