【问题标题】:Unit testing code that sends JMS messages发送 JMS 消息的单元测试代码
【发布时间】:2010-09-25 00:54:35
【问题描述】:

我有一个类,它在做一些事情后会发送一条 JMS 消息。 我想对“东西”进行单元测试,但不一定是消息的发送。

当我运行我的测试时,“stuff”绿色条,但在发送消息时失败(它应该,应用服务器没有运行)。 最好的方法是什么,是模拟消息队列,如果是,那是如何完成的。

我正在使用 Spring,并且“jmsTemplate”与“queue”一起被注入。

【问题讨论】:

  • 我刚刚添加了java标签,如果不正确可以删除它。

标签: java unit-testing spring jms jmstemplate


【解决方案1】:

我会使用的最简单的答案是删除消息发送功能。例如,如果你有这个:

public class SomeClass {
    public void doit() {
        //do some stuff
        sendMessage( /*some parameters*/);
    }

    public void sendMessage( /*some parameters*/ ) { 
        //jms stuff
    }
}

然后我会编写一个测试来掩盖 sendMessage 行为。例如:

@Test
public void testRealWorkWithoutSendingMessage() {
    SomeClass thing = new SomeClass() {
        @Override
        public void sendMessage( /*some parameters*/ ) { /*do nothing*/ }
    }

    thing.doit();
    assertThat( "Good stuff happened", x, is( y ) );
}

如果被存根或隐藏的代码量很大,我不会使用匿名内部类,而只是使用“普通”内部类。

【讨论】:

    【解决方案2】:

    您可以注入一个模拟的 jmsTemplate。

    假设是easymock,类似

    JmsTemplate mockTemplate = createMock(JmsTemplate.class)
    

    这样就可以了。

    【讨论】:

    • 打电话给EasyMock.createMock(JmsTemplate.class) 给我一个java.lang.NoClassDefFoundError: javax/jms/JMSException。有什么建议吗?
    • @rakslice 你的类路径中有类似 javax.jms-api jar 的东西吗?
    【解决方案3】:

    关于如何在更大的应用程序中组织所有这些测试存根/模拟...

    我们构建和维护了一个更大的企业应用程序,该应用程序使用 Spring 进行配置。真正的 App 在 JBoss Appserver 上作为 EAR 运行。我们用 beanRefFactory.xml 定义了 Spring 上下文

    <bean id="TheMegaContext"
              class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>BasicServices.xml</value>
                <value>DataAccessBeans.xml</value>
                <value>LoginBeans.xml</value>
                <value>BussinessServices.xml</value>
                ....
            </list>
        </constructor-arg>
    </bean>
    

    为了运行单元测试,我们只使用不同的 beanRefFactory.xml,它交换 BasicServices 以使用测试版本。在该测试版本中,我们可以使用与生产版本中相同的名称定义 bean,但使用模拟/存根或任何实现(例如,数据库使用本地 Apache DPCP 池数据源,而生产版本使用来自 Appserver 的数据源)。

    【讨论】:

      【解决方案4】:

      另一个选项是MockRunner,它为 JDBC、JMS、JSP、JCA 和 EJB 提供模拟环境。这使您可以像在“真实”案例中一样定义队列/主题并简单地发送消息。

      【讨论】:

        【解决方案5】:

        这是使用 jMock 单元测试的理想选择,因为您的服务器没有运行,但您可以使用 jMock 来模拟与服务器的交互。

        【讨论】:

          猜你喜欢
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          • 2018-07-30
          • 2012-01-07
          • 2017-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多