如何在 MUnit 中使用内部负载 (error.errorMessage.payload) 引发自定义错误

How to raise a Custom Error With Internal payload (error.errorMessage.payload) in MUnit

流程的简要说明: 我有一个流程正在对 REST Web 服务进行 HTTP 调用。我们得到了一些错误 statusCode=500 但在响应正文中有不同的 "errorCodes" 。此请求连接器根据其“when”属性中响应正文的内容包装在具有多个 on-error-continue 的 try 块中。例如:error.errorMessage.payload.errorCode==CODE_A。添加下面流程的图像和源代码

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
    <http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="dee432d7-a176-448c-a1ac-a374a86fa85b" >
        <http:listener-connection host="0.0.0.0" port="8081" />
    </http:listener-config>
    <flow name="test2Flow" doc:id="be602af1-cfcf-46f1-a312-ea6a5544503b" >
        <http:listener doc:name="Listener" doc:id="f160fa61-15be-4744-b823-973e20740e73" config-ref="HTTP_Listener_config" path="/test"/>
        <logger level="INFO" doc:name="Some logic before request" doc:id="6354a117-e918-4937-a1d9-df4ae0ef6386" message="Some logic before request"/>
        <try doc:name="Try" doc:id="15bd106a-c116-4d87-958e-8ad698026739" >
            <http:request method="GET" doc:name="Request" doc:id="a046919e-f149-45d6-9a70-db37cac0540f" url="http://example.com/some-resource" />
            <error-handler >
                <on-error-continue enableNotifications="true" logException="true" doc:name="when error.errorMessage.payload.errorCode==CODE_A" doc:id="20fc0575-da65-41b4-81f7-d364227b1639" when='error.errorMessage.payload.errorCode=="CODE_A"'>
                    <logger level="INFO" doc:name="Some logic for CODE_A" doc:id="a699ccd0-952c-415f-b288-4ea027f2cff2" message="Some logic for CODE_A" />
                </on-error-continue>
                <on-error-continue enableNotifications="false" logException="false" doc:name="when error.errorMessage.payload.errorCode==CODE_B" doc:id="63dc8aa5-5fae-4235-a4ae-a80903a76362" when='error.errorMessage.payload.errorCode=="CODE_B"' >
                    <logger level="INFO" doc:name="Some logic for CODE_B" doc:id="9364ff1e-4bcd-48d5-a37a-a207828cda9d" message="Some logic for CODE_B" />
                </on-error-continue>
            </error-handler>
        </try>
        <logger level="INFO" doc:name="Some logic After request" doc:id="fd754198-d6b5-40dd-b23f-c8619faee7e6" message="Some logic After request" />
    </flow>
</mule>

我正在尝试做什么:我正在尝试编写 MUnit 来验证是否根据响应执行了正确的错误处理程序块。但是,我没有看到任何选项来模拟错误,其 errorMessage 部分已填充。

我正在寻找的东西:我正在尝试找出其中之一

  1. 无论如何,使用简单的 mock-whenthen-return 元素来模拟 errorMessage 的错误。我认为这是不可能的,但如果有办法请告诉我。
  2. 也许有一种方法可以使用 Java class 来引发复杂的错误。我在想是否可以使用 mock-whenthen-call 来调用流程,然后使用它引发错误。
  3. 任何其他方式。

注:

  1. Mule 版本:4.3.0 MUnit 版本:2.3.0
  2. 我无法在 REST 网络服务中进行更改,我不拥有它。
  3. 我试图避免任何代码更改,例如,我可以忽略消息验证器中的状态代码并直接使用响应进行错误处理,例如选择。但我会作为最后的手段去做

您可以尝试在模拟 HTTP 请求错误时使用类似的东西:

创建以下 DW 文件:

httpError.dwl

var detailMessage = 'Internal server error'
var myJsonResponse = '{"errorCode":"ERROR_A"}'
var typedValue = java!org::mule::runtime::api::metadata::TypedValue::new(myJsonResponse, java!org::mule::runtime::api::metadata::DataType::JSON_STRING)
var errorMessage = java!org::mule::runtime::api::message::Message::of(typedValue)
var errorType = java!org::mule::extension::http::api::error::HttpError::INTERNAL_SERVER_ERROR
---
java!org::mule::extension::http::api::request::validator::ResponseValidatorTypedException::new(detailMessage, errorType, errorMessage)

在您的 MUnit 测试套件文件中,创建以下流程:

<flow name="munit-set-error-code-event-flow" doc:id="3b7e266c-2f3b-4105-8fdb-8ea44d5f128e" >
    <munit:set-event doc:name="Generate error" doc:id="4ee8b870-6c8b-4570-bc70-7ec0086a1bca" cloneOriginalEvent="true">
        <munit:error id="HTTP:INTERNAL_SERVER_ERROR" exception="#[${file::httpError.dwl}]" />
    </munit:set-event>
</flow>

最后,在您的实际 MUnit 测试流程中,配置 then-call 选项以调用上述流程。例如:

<munit:test name="test-test-suite-testFlowTest" doc:id="5670a9cd-758a-4f2c-a55f-57b48a9f3b41" description="Test" timeOut="1200000">
    <munit:behavior >
        <munit-tools:mock-when doc:name="Mock when" doc:id="466fd55c-80b4-4e27-82ed-f561223a3b4f" processor="http:request">
            <munit-tools:with-attributes >
                <munit-tools:with-attribute whereValue="08c4fba6-ef4b-4006-bd7d-deb1fd0f5304" attributeName="doc:id" />
            </munit-tools:with-attributes>
            <munit-tools:then-call flow="munit-set-error-code-event-flow" />
        </munit-tools:mock-when>
    </munit:behavior>
    <munit:execution >
        <flow-ref doc:name="Flow-ref to testFlow" doc:id="c57b3265-b453-432c-88fd-db2df7125fdc" name="testFlow"/>
    </munit:execution>
</munit:test>

虽然我不确定这是否是推荐的做法,但它应该可以实现您想要实现的目标。

如果有效请告诉我。