处理单元测试中的JMS代理依赖项

时间:2015-02-25 15:21:13

标签: c# unit-testing activemq moq tibco-ems

我目前正在构建一个组件,用于向不同的JMS代理发送和接收消息(例如ActiveMQ,TibcoEMS)。 显然,我想构建单元测试以验证该组件的功能。我想测试的一件事是发送消息的方法。

public void Send( IJmsMessage jmsMessageToSend ) {
        TIBCO.EMS.Connection connection = TempPermLayer.GetConnection();
        connection.Start();
        Session session = TempPermLayer.GetSession(connection);
        MessageProducer producer = TempPermLayer.GetMessageProducer(session);
        try {
            IMessageFactory<Message> messageFactory = new TibcoEmsMessageFactory(session, producer);
            Message message = messageFactory.ProduceMessageUsing(jmsMessageToSend);
            producer.Send(message);
        }
        finally {
            TempPermLayer.CleanUp();
        }
}

层类可以对方法的实际行为进行细粒度控制,因此是必要的。最后,上面的方法将归结为类似的东西:

public void Send( IJmsMessage jmsMessageToSend ) {
        ConnectionFactory connectionFactory = new ConnectionFactory(Host);
        Connection connection = connectionFactory.CreateConnection();
        connection.Start();
        Session session = connection.CreateSession(false, SessionMode.ClientAcknowledge);
        Destination dest = session.CreateQueue("myQueue");
        MessageProducer producer = session.CreateProducer(dest);
        IMessageFactory<Message> messageFactory = new TibcoEmsMessageFactory(session, producer);
        Message message = messageFactory.ProduceMessageUsing(jmsMessageToSend);
        producer.Send(message);
}

IJmsMessageTibcoEmsMessageFactory基本上是代理特定实现的包装器(例如TIBCO.EMS.Message)。

测试第一个提供的方法实际上不会测试我不需要测试的功能,例如Tibco EMS Client实现如何创建连接。还有一些额外的功能 - 与第二种方法不同,这是我实际上不会测试的东西;)

我看到了两种测试这种方法的方法:

  1. 模拟所有依赖关系,直到核心。这是我目前采用的方法,它被证明是非常耗费人力的 - 这是迄今为止我能看到的唯一真正的缺点。
  2. 在某处(可能是本地)托管一个实际的JMS代理。这可能就像在单元测试开始时执行的jar文件一样简单。我相信这会使单元测试最初更容易编写。我已经看到这种方法在一些Rest-clients中使用(例如,只启动Jetty)。它减轻了模拟所有依赖项的需要,但它可能使单元测试过程在长期内更难维护 - 尤其是在涉及构建服务器时。
  3. 实际问题:

    我忘了还有其他方法或可能吗?如果没有,你认为上述哪种方法在我的情况下更可取?

1 个答案:

答案 0 :(得分:0)

模拟JMS实现听起来很乏味。如果您还想这样做,请考虑this article

我个人更喜欢拥有并自动化本地JMS代理...... 如何使用轻量级服务器,例如FFMQ

我采取的两个想法in another post