【问题标题】:Testing sub-flows in Mule在 Mule 中测试子流程
【发布时间】:2022-04-06 03:04:36
【问题描述】:

我已经开始为我的 Mule 项目编写测试用例。

我为我的主要流程编写了功能测试用例,如下所示。

public void testMainFlow_1() throws Exception{
     MuleClient client = muleContext.getClient();
            MuleMessage result = client.send(helloServiceAddress, fileAsString("SamplePayloads/input_Request.xml"), properties);
    assertNotNull("Null Result", result);           
    assertEquals(result.getPayloadAsString(), fileAsString("SampleResponses/sampleResponse.xml"));   

}

但是我怎样才能测试我的子流程。他们没有任何终点。那么如何将有效负载传递给他们并进行测试。

下面是我的流程配置。

<flow name="main_flow" >
    ....
    ....
    <flow-ref  name="subflow_1" />
    ....
    ....
    <flow-ref  name="subflow_2" />
    ....
    ....
</flow>

<sub-flow name="subflow_1">
    ....
    <some-transformer ... />
    <out-bound call to web-service />
    <some-transformer ... />
    ....
</sub-flow>

<sub-flow name="subflow_2">
    ....
    <some-transformer ... />
    <out-bound call to web-service />
    <some-transformer ... />
    ....
</sub-flow>

【问题讨论】:

    标签: java unit-testing mule functional-testing


    【解决方案1】:

    使用FunctionalTestCase 应该很简单:

    MessageProcessor subFlow = muleContext.getRegistry().lookupObject("subflow_1");
    MuleEvent result = subFlow.process(getTestEvent("test_data"));
    

    但是it doesn't work.

    目前,IMO 的最佳方法是拥有一个测试配置,其中包含您要测试的子流程的流程包装器,并将此测试配置与 FunctionalTestCase 中的主配置一起加载。

    @genjosanzo 的方法也有效,但它基于将子流与测试代码本身的预先存在的主流相关联。我个人认为创建测试流程会更严格。

    【讨论】:

    • 我尝试为子流创建包装流。这是一种解决方法。但是想试试Mule中是否有直接支持测试子流程的东西。
    • 那么请投票/关注我在回答中创建并链接的 JIRA 票证。
    • 完成。非常感谢。
    【解决方案2】:

    通过使用最新的 Mule 版本,我们可以使用以下脚本测试子流程:

    SubflowInterceptingChainLifecycleWrapper subFlow = getSubFlow("subflowName");
    subFlow.initialise();
    
    MuleEvent event = subFlow.process(getTestEvent(""));
    MuleMessage message = event.getMessage();
    
    assertEquals(expect, message.getPayload()); 
    

    【讨论】:

      【解决方案3】:

      从测试用例调用子流相当简单,这是一个示例:

          @Test
          public void invokeSubFlow() throws Exception {
              MessageProcessor mp = (MessageProcessor) muleContext.getRegistry()
                      .lookupObject("subflow_2");
              FlowConstruct parentFlow = muleContext.getRegistry().lookupFlowConstruct("main_flow");
              ((FlowConstructAware) mp).setFlowConstruct(muleContext.getRegistry()
                      .lookupFlowConstruct("subflow_2"));
              Lifecycle lc = (Lifecycle) mp;
              lc.initialise();
              lc.start();
              MuleMessage muleMessage = new DefaultMuleMessage("test", muleContext);
              MuleEvent event = new DefaultMuleEvent(muleMessage,
                      MessageExchangePattern.REQUEST_RESPONSE,
                      new DefaultMuleSession(parentFlow,muleContext));
      
              mp.process(event);
          }
      

      【讨论】:

      • 我不得不对你断言它“相当简单”给出以下代码有点轻笑,但感谢您发布此内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多