骡子功能测试 - 完全混淆

时间:2012-11-28 16:38:13

标签: esb mule

我们有一个具有6或7个流的Mule应用程序,每个流程大约有5个组件。 这是设置。 我们将JMS请求发送到ActiveMQ队列。骡子听了。根据消息的内容,我们将其转发给相应的流程。

 <flow name="MyAPPAutomationFlow" doc:name="MyAPPAutomationFlow">
      <composite-source>
            <jms:inbound-endpoint queue="MyAPPOrderQ" connector-ref="Active_MQ_1" doc:name="AMQ1 Inbound Endpoint"/>
            <jms:inbound-endpoint queue="MyAPPOrderQ" connector-ref="Active_MQ_2" doc:name="AMQ2 Inbound Endpoint"/>
      </composite-source>
        <choice doc:name="Choice">
            <when expression="payload.getProcessOrder().getOrderType().toString().equals(&quot;ANC&quot;)" evaluator="groovy">
                <processor-chain>
                    <flow-ref name="ProcessOneFLow" doc:name="Go to ProcessOneFLow"/>
                </processor-chain>
            </when>
            <when....
            ...........


         </choice>
    </flow>


 <flow name="ProcessOneFLow" doc:name="ProcessOneFLow">
        <vm:inbound-endpoint exchange-pattern="one-way" path="ProcessOneFLow" responseTimeout="10000" mimeType="text/xml" doc:name="New Process Order"/>
        <component doc:name="Create A">
            <spring-object bean="createA"/>
        </component>
        <component doc:name="Create B">
            <spring-object bean="createB"/>
        </component>
        <component doc:name="Create C">
            <spring-object bean="createC"/>
        </component>
        <component doc:name="Create D">
            <spring-object bean="createD"/>
        </component>    
</flow>


 <spring:beans>

    <spring:import resource="classpath:spring/service.xml"/>
    <spring:bean id="createA" name="createA" class="my.app.components.CreateAService"/>
    <spring:bean id="createB" name="createB" class="my.app.components.CreateBService"/>
    <spring:bean id="createC"  name="createC" class="my.app.components.CreateCService"/>
    <spring:bean id="createD" name="createD" class="my.app.components.CreateDService"/>
            ......
            ......
 </spring:beans>

现在我不确定如何用它们编写功能测试。

我浏览了Mule网站上的功能测试文档,但是他们有非常简单的测试。

功能测试是不是应该使用DAO或服务层进行实际的后端更新,还是只是模拟服务层的单元测试的扩展?

我的想法是 - 它可以接受请求并使用内存Mule服务器将请求响应从一个组件传递到另一个组件。 另外请注意,我们的任何流都没有Outbound端点,因为它们主要是Fire和Forget类型流,状态更新由组件执行的DB更新管理。

另外,为什么我需要为测试创建单独的mule config xml文件?如果我没有测试实际部署在Live上的flow xml,那么测试的重点是什么?我正在创建单独的xml配置,仅用于测试,这有点挫败了我的目的...... 有些专家能够更多地阐明并指出类似于我们正在使用的示例测试。

PS:Mule中的组件依赖于外部系统,如Web服务,数据库等。对于功能测试,我们是否需要运行那些或者我们是否应该模拟这些服务/ Db访问?

2 个答案:

答案 0 :(得分:3)

对Mule应用程序进行功能测试与测试任何依赖外部资源的应用程序(如数据库或JMS代理程序)没什么区别,因此您需要使用与标准应用程序相同的技术。

通常这意味着使用内存实现来存储资源,例如数据库的HSQLDB或JMS的瞬态ActiveMQ内存代理。对于Mule应用程序,这意味着模块化您的配置,因此“实时”传输在一个单独的文件中定义,您可以在测试时将其替换为包含内存中变体的文件。

要验证Mule与资源的正确交互,您可以使用其Java客户端(例如JDBC或JMS)直接读取资源,如果您想确保纯粹的非Mule客户端没有问题,这是很好的阅读Mule已分派的内容,或使用MuleClient从这些资源中读取或创建使用这些资源的流并将消息传递给<test:component>

  

FYI Mule in Action, second edition的第12章解释并演示了这些不同的技术。

答案 1 :(得分:0)

https://blog.codecentric.de/en/2015/01/mule-esb-testing-part-13-unit-functional-testing/

https://developer.mulesoft.com/docs/display/current/Functional+Testing 请参考此链接 如您所见,它是一个普通的JUnit测试,扩展了FunctionalMunitSuite类。 在我们的测试中我们需要做两件事:

准备MuleEvent对象作为我们流程的输入。我们可以通过使用提供的testEvent(Object payload)方法来实现。 执行runFlow(String flowName,MuleEvent event)方法,指定要测试的流名称和我们刚刚在第一步中创建的事件。