1

我们正在尝试在 MUIT 套件中模拟 Amazon 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: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>

我们还在 Mule 论坛上记录了一张票,但我们还没有任何解决方案。有谁知道我们如何在 Mulesoft 中记录 Jira?

从 stackoverflow 上的其他一些问题来看,许多其他 OOB 连接似乎存在同样的问题。MUNIT mock 似乎有很多缺陷。

4

1 回答 1

0

从您提供的代码中我可以看出,您的 Mock 组件没有模拟子流程,因为您的子流程没有“doc:name”的属性。它只有“名称”属性。所以你的配置应该看起来像

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

如果这仍然不起作用,请尝试更改whereValue="#[matchContains('copyactionflowRef')]"

希望这可以帮助!

于 2017-10-19T11:38:24.860 回答