2017-10-19 199 views
0

我們試圖模擬MUNIT套件中的Amazon S3連接器。我們已經嘗試過多種方法,但模擬從未似乎工作:Mocked Amazon S3 Mule連接器仍然會調用實際的S3操作

  1. 對於單個流量增加了S3連接器,我們試圖建立一個有效載荷嘲笑響應。但最終的輸出總是實際的有效載荷。
  2. 然後我們將S3調用移動到子流,並試圖模擬整個子流調用本身,但它始終調用實際的s3存儲桶動作。
  3. 圍繞子流程調用間諜也沒有什麼區別。

主要流程:

<flow name="helios-s3-copy-file" 
     processingStrategy="synchronous"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="/movefile" doc:name="HTTP"/> 

    <set-variable value="#['Test']" variableName="feedPathPrefix" doc:name="Set feed prefix" /> 
    <set-variable variableName="srcPath" 
         value="#[feedPathPrefix + '/TestFilemule.xlsx']" 
         doc:name="Source" /> 
    <set-variable variableName="destPath" 
         value="#[feedPathPrefix + '/dest/TestFilemule.xlsx']" 
         doc:name="Destination" /> 
    <flow-ref name="copyactionflowRef" doc:name="copyactionflow"/> 
    <logger 
      level="INFO" doc:name="Logger" message="#[flowVars.copyMsg]"/> 
    <set-payload value="#[flowVars.copyMsg]" doc:name="Set Payload"/> 
</flow> 
<sub-flow name="copyactionflowRef"> 
    <s3:copy-object config-ref="Amazon_S3__Configuration" sourceBucketName="some-bucket-name" sourceKey="#[srcPath]" destinationBucketName="some-bucket-name" destinationKey="#[destPath]" doc:name="Copy Processed File"/> 
    <set-variable variableName="copyMsg" value="#['Completed copy from ' + feedPathPrefix + ' to ' + destPath + ' directory']" doc:name="Variable"/> 
</sub-flow> 

Munit測試用例:

<munit:test name="amazons3test-test-suite-helios-s3-copy-fileTest" description="Testing mocking of copy objects" > 
    <mock:when messageProcessor="mule:sub-flow" doc:name="Mock2"> 
     <mock:with-attributes> 
      <mock:with-attribute name="doc:name" whereValue="#['copyactionflowRef']"/> 
     </mock:with-attributes> 
     <mock:then-return payload="#['Copy completed payload']"> 
      <mock:outbound-properties> 
       <mock:outbound-property key="copyMsg" value="Copy complete"/> 
      </mock:outbound-properties> 
     </mock:then-return> 
    </mock:when> 

    <!-- <mock:spy messageProcessor="mule:sub-flow" doc:name="Spy"> 
     <mock:with-attributes> 
      <mock:with-attribute name="doc:name" whereValue="#['copyactionflowRef']"/> 
     </mock:with-attributes> 
     <mock:assertions-before-call> 
      <logger message="Must not make actual S3 call" level="INFO" doc:name="Logger"/> 
     </mock:assertions-before-call> 
     <mock:assertions-after-call> 
      <munit:set payload="#['mock payload']" doc:name="Set Message"> 
       <munit:invocation-properties> 
        <munit:invocation-property key="copyMsg" value="Value from Spy"/> 
       </munit:invocation-properties> 
      </munit:set> 
     </mock:assertions-after-call> 
    </mock:spy> --> 
    <flow-ref name="helios-s3-copy-file" doc:name="Flow-ref to helios-s3-copy-file"/> 
</munit:test> 

我們也記錄在騾子論壇上ticket,但我們還沒有得到任何的解決方案呢。有誰知道我們如何在Mulesoft中記錄Jira?

從其他一些關於stackoverflow的問題來看,許多其他的OOB連接似乎也存在相同的問題。 MUNIT模擬似乎有很多缺陷。

回答

0

從我提供的代碼中可以看出,您的Mock組件不會嘲笑子流,因爲您的子流沒有「doc:name」屬性。它只有「名稱」屬性。所以,你的配置應該像

<mock:with-attributes> 
     <mock:with-attribute name="name" whereValue="#['copyactionflowRef']"/> 
</mock:with-attributes> 

的東西,如果這不仍然工作,嘗試改變whereValue="#[matchContains('copyactionflowRef')]"

希望這有助於!

+0

使用「matchContains」檢查後,子流程正在被模擬。但是,如果S3連接器是同一流的一部分,則模擬對象有效載荷將被重新覆蓋。所以,我們的問題只能部分解決。我們仍然需要一種方法來以相同的流程模擬S3連接器。但感謝您的答案。 – gsonal