如何使用Munit Spy在传出的Mule请求上声明标头

时间:2015-04-15 03:34:41

标签: mule

我的mule流正在使用http:request组件发出传出的http请求。我正在使用http:request-builder向请求添加标头。

    <http:request doc:name="unnamedImportApi"
        config-ref="HTTP_Request_Configuration"
        path="${outgoing.api.base_path}/import" method="POST">
        <http:request-builder>
            <http:header headerName="Authorization" value="Token token=#[flowVars['api_key']]"/>
        </http:request-builder>
    </http:request>

编写测试时,我正在使用MUnit模拟和间谍来断言传出的请求内容。我不知道如何在间谍中获取标题的值。例如。下面我想在 spyData 中存储授权标头和 authHeader ,但我不确定如何从MuleMessage获取标头。

       Map<String, String> spyData = new HashMap<>();
       spyMessageProcessor("request").ofNamespace("http")
        .withAttributes(attribute("path").withValue(apiPath))
        .before(new SpyProcess() {

            public void spy(MuleEvent event) throws MuleException {
                try {
                    spyData.put("payload", event.getMessage().getPayloadAsString());
                    spyData.put("contentType", ""+event.getMessage().getOutboundProperty("Content-type"));
                    spyData.put("method", ""+event.getMessage().getOutboundProperty("http.method"));
                    spyData.put("authHeader", ??????);
                } catch (Exception e) {
                    System.err.println("ERROR - Test Spy caused exception");
                    e.printStackTrace();
                    fail("Test Spy threw exception");
                }
            }
        });

2 个答案:

答案 0 :(得分:0)

向HTTP出站添加标头的另一种方法是使用mule messsage设置出站属性。 使用表达式转换器设置http标头,http出站端点将自动接收它。

在MUnit中,您可以访问eventContext作为静态变量,使用该变量可以检索mule消息,并可以设置或从中获取出站的proeprties。

答案 1 :(得分:0)

嗨,不确定是否有办法做你想做的事。

您看是否按照建议进行操作,并将标题设置为出站属性,然后您可以在部分之前的间谍中运行断言并验证那些出站变量是否存在。

但是如果你在请求构建中定义它们,那么在spy运行时,那些头文件尚未定义。那是因为这些变量的定义发生在连接器内部,也不在之前。

现在您可以尝试在之后运行验证,但在这种情况下,您将处理一条消息,该消息是您之前发送的请求的响应。所以不好。

那就是说,我想你要确保你的信息以你定义的方式出去。好像你在嗅闻。我认为你至少不能以一种简单的方式做到(即不是黑客方式)。

我想提出一些不同的东西。您的生产代码是:

<http:request doc:name="unnamedImportApi"
        config-ref="HTTP_Request_Configuration"
        path="${outgoing.api.base_path}/import" method="POST">
        <http:request-builder>
            <http:header headerName="Authorization" value="Token token=#[flowVars['api_key']]"/>
        </http:request-builder>
    </http:request>

现在,您通过设置#[flowVars ['api_key']]的值来构建标题 您可以通过执行以下操作在代码中检索该值:

spyData.put("authHeader", event.getMessage().getInvocationProperty("api_key"));

这应该足够验证,尽管你无法验证值value的静态部分=“Token token =是否正确。这是MUnit应该改进的东西。

如果请求构建者通过执行

说明,那么您应该相信
<http:header headerName

您最终会设置该标题,然后它应该有效。 就像信任您所依赖的API一样正常工作。因此,您可以专注于测试自己的代码。

HTH