在Anypoint Studio 7.5中用MUnit Set Event访问Headers等属性
我来帮你搞定这个MUnit测试的问题!你遇到的核心问题其实是Authorization头的格式不符合子流的处理逻辑,加上一些小的优化点,咱们一步步来解决:
1. 找到问题根源
你的子流setUserAndPass是专门处理Basic Auth格式的Authorization头:
- 先把Authorization值按空格拆分(比如
Basic dXNlcjE6cGFzc3dvcmQ=),取第二个base64编码的部分 - 再解码这个base64字符串,按冒号拆分得到用户名和密码
但你在MUnit里设置的authorization: 'authvalue'完全不符合这个格式——没有Basic 前缀,也不是base64编码的用户名:密码串。这就导致子流里的拆分逻辑拿到null,后续解码失败,流程直接跳到<otherwise>分支,而你又没设置username和password头,最终lvUSERNAME为空,断言自然失败。
2. 修复MUnit测试配置
方法一:测试Basic Auth分支
先把你要测试的用户名usernamevalue和密码(比如passwordvalue)拼接成usernamevalue:passwordvalue,然后转成base64编码,再加上Basic 前缀,放到Authorization头里:
<munit:test name="appname-test-suite-setUserAndPassTest" description="Test"> <munit:behavior > <munit:set-event doc:name="Set Event"> <munit:attributes value="#[ { headers : { 'authorization': 'Basic dXNlcm5hbWV2YWx1ZTpwYXNzd29yZHZhbHVl' } }]" /> </munit:set-event> </munit:behavior> <munit:execution > <flow-ref doc:name="Flow-ref to setUserAndPass" name="setUserAndPass"/> </munit:execution> <munit:validation > <munit-tools:assert-equals doc:name="Assert equals" actual="#[vars.lvUSERNAME]" expected="usernamevalue"/> </munit:validation> </munit:test>
注:上面的dXNlcm5hbWV2YWx1ZTpwYXNzd29yZHZhbHVl就是usernamevalue:passwordvalue的base64编码结果,你可以用DataWeave的toBase64("usernamevalue:passwordvalue" as Binary)自己生成
方法二:测试Otherwise分支
如果要测试没有Authorization头的情况,直接在headers里设置username和password即可:
<munit:set-event doc:name="Set Event"> <munit:attributes value="#[ { headers : { 'username': 'usernamevalue', 'password': 'passwordvalue' } }]" /> </munit:set-event>
3. 优化子流的容错性(可选)
你子流里的表达式用了转义的",可以换成更易读的写法,还可以加个空值判断避免报错:
<ee:transform doc:name="Transform Message" > <ee:message > </ee:message> <ee:variables > <ee:set-variable variableName="userAndPass" ><![CDATA[%dw 2.0 import * from dw::core::Binaries output text/json var auth = attributes.headers.authorization default "" var encodedCreds = (auth splitBy(" "))[1] default "" --- if (encodedCreds != "") (fromBase64(encodedCreds as Binary)) splitBy(":") else []]]></ee:set-variable> </ee:variables> </ee:transform>
4. 确认MUnit属性结构的正确性
顺便说一句,你原来的munit:set-event里的属性结构是对的——{ headers : {...} }可以被子流里的attributes.headers正确访问,这个部分没有问题。
内容的提问来源于stack exchange,提问作者naren

