2013-02-27 35 views
0

我已经编写了单元测试用例来在我的mule流程中单独测试消息处理器。单元测试不适用于XSLT转换器

但单元测试失败,错误

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); 

请帮我理解这里发生了什么事。

回答

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变压器!)。所以它会为你初始化XsltTransformer。

直接引用MessageProcessor的地方不会。

+0

它工作。谢谢瑞恩。但仍然不明白为什么messageprocessor.process方式不起作用。 – user1760178 2013-02-27 20:47:05

+1

我相信这是因为当你将它作为流的一部分调用时,你正在MessageProcessorChain中执行它,它会在适当的地方初始化每个消息处理器。直接引用MessageProcessor的地方不会初始化它。我已经更新了包含更多信息的答案。 – 2013-02-27 21:15:50

相关问题