【问题标题】:Unit testing is not working with XSLT tansformer单元测试不适用于 XSLT 转换器
【发布时间】:2013-06-05 20:22:41
【问题描述】:

我已经编写了单元测试用例来单独测试我的 mule 流程中的消息处理器。

但是单元测试失败并出现错误

org.mule.api.transformer.TransformerMessagingException: Property "xsl-file or xsl-text" not set.  
One or more of them must be set (org.mule.api.lifecycle.InitialisationException).
 Message payload is of type: String    
 (org.mule.api.transformer.TransformerMessagingException). Message payload is of type: String

其中一个转换器是 XSLT,如下所示。

<mule-xml:xslt-transformer  maxIdleTransformers="2" maxActiveTransformers="5"   xsl-file="C:\EWS\myproj\src\main\resources\xslt\DataAdder.xsl"
         name="AdderXSLT"   >
    </mule-xml:xslt-transformer>

单元测试方法如下。

    MessageProcessor subFlow = muleContext.getRegistry().lookupObject("AdderXSLT");
    MuleEvent result = subFlow.process(getTestEvent(getFileAsString("SamplePayloads/input.xml")));  

    System.out.println("The output from Event is " + result.getMessageAsString());
    System.out.println("The converted XML is " + result.getMessage().getPayloadAsString()); 

    assertNotNull(result);
    assertNull(result.getMessage().getExceptionPayload());
    assertFalse(result.getMessage().getPayload() instanceof NullPayload);

请帮助我了解这里出了什么问题。

【问题讨论】:

    标签: java xslt junit mule transformer


    【解决方案1】:

    我之前遇到过类似的情况,当您不在流上下文中执行转换器时,您需要显式初始化转换器。过去,为了测试我使用过的 xslt 转换器,类似于以下内容:

    XsltTransformer xslt = FunctionalTestCase.muleContext.getRegistry()
                    .lookupObject("SuccessResponseTransformer");
            xslt.setReturnDataType(DataType.STRING_DATA_TYPE);
            xslt.initialise();
    
            String result = (String) xslt.transform(srcXML);
    

    您可以尝试类似的方法或尝试强制转换为 XsltTransformer 进行初始化。

    我相信这是因为当您将 MP 作为流的一部分执行时,它是 MessageProcessorChain 的一部分,它将在适当的情况下初始化每个 MP。如果您看一下来自 AbstractMessageProcessorChain - http://grepcode.com/file/repo1.maven.org/maven2/org.mule/mule-core/3.3.1/org/mule/processor/chain/AbstractMessageProcessorChain.java#AbstractMessageProcessorChain.initialise%28%29 的以下代码:

    public void initialise() throws InitialisationException
        {
             for (MessageProcessor processor : processors)
           {
             // MULE-5002 TODO review MP Lifecycle
                if (processor instanceof Initialisable /* && !(processor instanceof Transformer) */)
               {
                    ((Initialisable) processor).initialise();
                }
            }
        }
    

    请注意 (!instanceof Transformer) 已被注释掉。所以它会为你初始化 XsltTransformer。

    直接引用 MessageProcessor 不会。

    【讨论】:

    • 成功了。谢谢瑞恩。但仍然无法理解为什么 messageprocessor.process 方式不起作用。
    • 我相信这是因为当您将它作为流的一部分调用时,您是在 MessageProcessorChain 中执行它,它将在适当的情况下初始化每个消息处理器。直接引用 MessageProcessor 不会初始化它。我已更新答案以包含更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多