📅  最后修改于: 2023-12-03 15:03:03.829000             🧑  作者: Mango
MUnit是MuleSoft的测试框架,它能够对Mule应用程序进行单元测试、集成测试和端对端测试以及模拟测试,首页地址:https://www.mulesoft.com/platform/munit
轻松编写测试代码,MUnit提供了基于Java的DSL,使得测试代码能够以更简洁、易于理解的方式进行编写。
支持多种测试类型,包括单元测试、集成测试和模拟测试,让测试人员能够全面、高效地检查应用程序的各个方面。
集成Mule运行时,可以在Mule平台上快速创建、运行和验证测试用例,以及对应的Mock服务调用。
首先需要确保在Mule项目中正确添加了MUnit的依赖项,例如:
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-munit</artifactId>
<version>${munit.version}</version>
<scope>test</scope>
</dependency>
在使用MUnit之前,还需要确保已经正确安装了Anypoint Studio和Mule运行时。
MUnit测试用例通常由几个部分组成:
Mule配置文件:用于设定Mule中使用的连接器、端点和数据映射等配置。
测试流程:用于定义测试流程和消息封装,以及对输出流的校验等操作。
MUnit测试语句:用于检查Mule应用程序是否符合我们的预期。
例如:
<munit:config name="munit" doc:name="MUnit configuration" />
<flow name="testFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP" />
<set-payload value="#['hello, world!']" doc:name="Set Payload" />
<logger level="INFO" doc:name="Logger" />
</flow>
<munit:test name="testFlowTest" description="Test">
<munit:set payload="#['test data']" doc:name="Set Message Payload" />
<flow-ref name="testFlow" doc:name="Flow Reference" />
<munit:assert-payload-equals expectedValue="hello, world!" doc:name="Assert Payload Equals" />
</munit:test>
该测试用例包含了一个流,其中的组件将一个固定的字符串输出到控制台上。然后MUnit运行该流程,将一个新的字符串插入到流程中,并检查流程输出的字符串是否与我们预期的字符串相同。如果检查通过,则测试用例通过。稍后会对这里进行详细的讲解。
测试用例创建完成后,我们需要在Mule鼠标上右键,然后选择“Run MUnit Suite”菜单项以验证测试结果。测试工具将读取Munit配置文件,并执行在Munit测试语句中指定的所有测试,然后返回测试结果。
常用的MUnit基础验证器有:
assert-truth:当Mule出现任何null或false值时,抛出一个validation异常, 然后中断测试流程。
assert-true:断言此值为true, 如果该值不是true,则抛出validation异常,然后中断测试流程。
assert-false:断言此值为false, 如果该值不是false,则抛出validation异常,然后中断测试流程。
assert-not-null: 断言此值不为null, 如果该值是null,则抛出validation异常,然后中断测试流程。
assert-null:断言此值为null, 如果该值不是null,则抛出validation异常,然后中断测试流程。
例如:
<munit:verify-throws message="unexpected message" exception="java.lang.RuntimeException" doc:name="Verify Throws" >
<message-processor-chain>
<expression-component>throw new RuntimeException()</expression-component>
</message-processor-chain>
</munit:verify-throws>
该测试用例包含一个verify-throws块,用于验证抛出异常的条件是否合法。MUnit会读取该块中的代码,验证代码是否会引发RuntimeException异常。
MUnit提供了许多消息验证器,以验证消息的内容、属性、日期等等,包括:
assert-payload-equals:比较预期和接收消息的负载内容是否相等。
assert-not-empty:如果发现负载中存在空值,则抛出validation异常,然后中断测试流程。
assert-object-same:比较两个负载对象是否相同。
assert-xml-payload:验证xmlpayload。
例如:
<munit:assert-payload-equals expectedValue="Hello, World!" doc:name="Assert Payload Equals" />
该测试用例包含assert-payload-equals块,用于验证Mule的输出是否符合预期。MUnit会比较预期输出和实际输出的内容,如果不同,则抛出validation异常,然后中断测试流程。
MUnit还提供了Mocking功能,它允许我们模拟与外部系统的交互、可测试性以及按预期返回结果的情况。例如,模拟HTTP的GET请求或模拟数据库连接器。MUnit的Mocking使用Mockito的mocks。
<munit:mock-when messageProcessor="http:outbound-endpoint" doc:name="Mock Endpoint">
<munit:then-return messageProcessor="http:outbound-endpoint" ><![CDATA[#[payload]]]></munit:then-return>
</munit:mock-when>
该测试用例中的mock-when和then-return块就是Mocking的一部分。在这个例子中,我们模拟了一个http:outbound-endpoint,然后释放persistent连接,这样我们就可以模拟许多与外部连接器交互的情况了。