单元测试发送JMS消息的代码

java unit-testing spring jms jmstemplate

21603 观看

5回复

747 作者的声誉

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

当我运行我的测试时,“东西”绿色条,但在发送消息时失败(它应该,应用服务器没有运行)。执行此操作的最佳方法是,是否模拟消息队列,如果是这样,如何完成。

我正在使用Spring,并注入“jmsTemplate”和“queue”。

作者: bmw0128 的来源 发布者: 2008 年 12 月 2 日

回应 (5)


6

1353 作者的声誉

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

假设easymock,就像

JmsTemplate mockTemplate = createMock(JmsTemplate.class)

那就行了。

作者: tunaranch 发布者: 02.12.2008 10:09

8

18482 作者的声誉

决定

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

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

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

作者: Alex B 发布者: 02.12.2008 10:10

1

254002 作者的声誉

另一个选项是MockRunner,它为JDBC,JMS,JSP,JCA和EJB提供模拟环境。这允许您像在“真实”情况下一样定义队列/主题,并简单地发送消息。

作者: Aaron Digulla 发布者: 03.12.2008 08:56

0

6069 作者的声誉

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

我们构建并维护一个使用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的数据源) )。

作者: Ichthyo 发布者: 30.11.2010 03:34

0

534 作者的声誉

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

作者: Kumar Manish 发布者: 17.01.2012 07:22
32x32