2013-02-27 41 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

相關問題