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

问题描述 投票:0回答:1

我有一个流程正在对 REST Web 服务进行 HTTP 调用。我们得到了一些错误,如

statusCode=500
但在响应正文中具有不同的
"errorCodes"
。该请求连接器被包装在一个带有多个
on-error-continue
的 try 块中,基于其“when”属性中响应正文的内容。例如:
error.errorMessage.payload.errorCode==CODE_A
。添加下面流程的图像和源代码

enter image description here

<?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. 使用简单的
    errorMessage
    mock-when
    元素来模拟
    then-return
    错误的任何方法。我认为这是不可能的,但如果有办法请告诉我。
  2. 也许有一种方法可以使用 Java 类来引发复杂的错误。我在想是否可以使用
    mock-when
    then-call
    来调用流程,然后使用它引发错误。
  3. 还有其他方法吗

注:

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

在模拟 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>

虽然我不确定这是否是建议做的事情,但它应该适合您想要实现的目标。

如果有效请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.