我在m子中有db连接器,该连接器具有用于查询记录数的选择查询,数据库的响应如下:
多段代码片段:
<db:select config-ref="Oracle_Configuration" doc:name="FetchDetails">
<db:parameterized-query><![CDATA[SELECT COUNT(1) AS COUNT from MAPPER_T where ST_NO=#[flowVars.fetchNO] and DATE=SYSDATE]]></db:parameterized-query>
</db:select>
<choice doc:name="EvaluateCount">
<when expression="#[payload[0]['COUNT'] == 0]">
<logger message="#[payload]" level="INFO" category="DO SOMETHING X" doc:name="Logger"/>
</when>
<otherwise>
<logger message="#[payload]" level="INFO" category="DO SOMETHING Y" doc:name="Logger"/>
</otherwise>
</choice>
使用mel#[message.payload]使用记录器响应数据库调用
[{COUNT=1}]
在munit实现中,我试图模拟此响应,并且使用了MULE的MOCK组件,下面是我的代码:
<munit:test name="api-Happy-Scenario-test-suiteTest" description="MUnit Test">
<mock:when messageProcessor=".*:.*" doc:name="Mock - Evaluate Results">
<mock:with-attributes>
<mock:with-attribute name="doc:name" whereValue="#['FetchDetails']"/>
</mock:with-attributes>
<mock:then-return payload="#[{COUNT: 0}]"/>
</mock:when>
<munit:set payload="#[getResource('json/ResultsRequest.json').asString()]" mimeType="application/json" doc:name="Set Message">
</munit:set>
<flow-ref name="post:/results:api-config" doc:name="InvokeResultsService"/>
<munit:assert-true message="The HTTP Status code is not correct!" condition="#[messageInboundProperty('http.status').is(eq(201))]" doc:name="assert that - http.status eq 201"/>
<munit:assert-null doc:name="Assert Null Payload"/>
</munit:test>
但是在执行测试用例时,我得到了以下异常:
Caused by: org.mule.api.expression.ExpressionRuntimeException: Execution of the expression "payload[0]['COUNT']" failed.
Caused by: [Error: java.lang.Character cannot be cast to java.lang.Class]
[Near : {... payload[0]['COUNT'] ....}]
^
[Line: 1, Column: 1]
能否请您帮我模拟响应。谢谢!!
答案 0 :(得分:1)
我知道您已经问了这个问题已有一段时间了,但是我还是要为将来的观众回答。这就是对我有用的。
通常,来自数据库连接器的响应是一个哈希映射。您将必须引用groovy文件来模拟数据库响应。
MOCK示例:
<mock:when messageProcessor="db:select" doc:name="Mock - Evaluate Results">
<mock:with-attributes>
<mock:with-attribute name="doc:name" whereValue="FetchDetails"/>
</mock:with-attributes>
<mock:then-return payload="#[resultOfScript('FetchDetailsGroovyScript')]"/>
</mock:when>
还在munit config.xml中包含以下行以引用groovy脚本。
<scripting:script name="FetchDetails" engine="groovy" file="mock-data/Fetch-Details-Groovy-Script.groovy" doc:name="Script"/>
Groovy脚本示例:Fetch-Details-Groovy-Script.groovy
def map1 = new org.mule.util.CaseInsensitiveHashMap()
map1.put('COUNT',0)
def listOfMap = new LinkedList<org.mule.util.CaseInsensitiveHashMap>()
listOfMap.add(map1)
return listOfMap
答案 1 :(得分:0)
您在mock:then-return
中使用的语法无效。
您缺少几件事:
#[...code goes here...]
{COUNT: 1}
所以您的mock:then-return
应该如下所示:
<mock:then-return payload="#[[{COUNT: 1}]]"/>