我们有一个具有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("ANC")" 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访问?
答案 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)方法,指定要测试的流名称和我们刚刚在第一步中创建的事件。