我如何在Munit Spy发出的Mule请求上断言头

我如何在Munit Spy发出的Mule请求上断言头,mule,Mule,我的mule流正在使用http:request组件发出一个传出http请求。我正在使用http:request生成器向请求添加头 <http:request doc:name="unnamedImportApi" config-ref="HTTP_Request_Configuration" path="${outgoing.api.base_path}/import" method="POST"> <http:reque

我的mule流正在使用http:request组件发出一个传出http请求。我正在使用http:request生成器向请求添加头

    <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>
在编写测试时,我使用munitmock和spies来断言传出请求的内容。不过,我不知道如何在spy中获取头的值。下面我想将authHeader与authHeader一起存储在spyData中,但不确定如何从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");
                }
            }
        });

向http出站添加头的另一种方法是使用mule Message设置出站属性。 使用expression transformer设置http头,http出站端点将自动接收该头


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

您好,不确定有什么方法可以实现您想要的

您可以看到,如果您按照建议的那样将头设置为出站属性,那么您可以在spy before部分中运行断言,并验证这些出站变量是否存在

但是如果您在请求构建中定义它们,那么在spy运行时,这些头文件还没有定义。这是因为这些变量的定义发生在连接器内部,而不是在连接器之前或之后

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

也就是说,我认为您希望确保您的消息以您定义的方式发布。好像你在嗅。我认为你至少不能用一种简单的方式,也就是说,不能用黑客的方式

不过,我想提出一些不同的建议。您的生产代码是:

<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>
虽然您无法验证value=Token=Token=的静态部分是否正确,但这已经足够验证了。这是穆尼特应该改进的地方

您应该相信,如果请求生成器这样说

<http:header headerName
您将最终设置该标题,然后它应该可以工作。 就像相信你所依赖的API能正常工作一样。因此,您可以专注于测试自己的代码


是的,谢谢。我暂时用set属性设置标题来解决这个问题。但是我希望我可以使用http:request-builder。谢谢你的努力。是的,我想这可能是不可能的。我现在使用一个轻型服务器来模拟端点,所以可以嗅探这样的头,或者只是在之前设置它们。我现在明白了,这是因为mock替换了整个组件,包括其中的构建器。再次感谢
<http:header headerName