<?xml version="1.0" encoding="UTF-8"? >
<mockConfig>
<mockObjects>
<mockObject name="Object name" mockedClass="Mock class or interface" />
......
</mockObjects>
<mockBehaviors>
<mockBehavior mockObject=" Object name" method="Expected invocation method">
<paramValues>
<paramValue type="Parameter type" value="Parameter value" />
</paramValues>
<ctrlOptions>
<ctrlOption option="Control option" value="Expected return value"
times="Expected invocation times" />
……
</ctrlOptions>
</ mockBehavior>
......
</ mockBehaviors>
</mockConfig>
其中,<mockObjects> 部分将配置 Mock 对象的生成信息,<mockBehaviors> 部分将配置 Mock 对象的预期行为和输出。接下来,我们将对这两部分进行详细的说明。
配置文件中所包含的 Mock 对象生成信息包含在 <mockObject> 元素当中。<mockObject> 元素包含两个属性 name 和 mockedClass,分别对应 Mock 对象的名称和对应的接口或类。Mock 对象的名称用于和配置文件中的其它部分相关联,而对应的接口和类用于 Mock 对象的生成。
ResultSet 接口是每个 Java 开发人员都非常熟悉的接口。以 java.sql.ResultSet 接口为例,为其生成一个 Mock 对象 mockResultSet,可以在文件中配置为:
<mockObject name="mockResultSet" mockedClass="java.sql.ResultSet" />
我们可以设想一下,在 EasyMock 中,如果我们需要创建 ResultSet 接口的一个 Mock 对象,这个过程应当是: IMocksControl mocksControl = EasyMock.createControl();
ResultSet mockResultSet = control.createMock(ResultSet.class);
其中,IMocksControl 接口的实例 mocksControl 能生成并管理多个 Mock 对象。在 XMLEasyMock 中,我们为每个 Mock 对象创建一个 MockObject 类的对象,同时用一个 MockObjectController 对象来管理这些 Mock 对象。MockObjectController 类拥有一个 IMocksControl 成员变量,同时提供了 replay、verify 和 reset 方法,供外部调用(如下图):
EasyMockUtil 是提供给外部程序调用的工具类,loadConfig 方法用于读取配置文件,findMockObjectByName 方法可以通过 Mock 对象的变量名返回 Mock 对象。
接下来我们需要配置的是 Mock 对象的预期行为。Mock 对象的预期行为可以简单的理解为是 Mock 对象方法的调用以及该方法的预期输出。我们需要在文件中分别配置方法的预期调用和预期输出。
Mock 对象的预期方法调用配置在 <mockBehavior> 元素中。每个 <mockBehavior> 元素都包含两个属性:mockObject 和 method 属性。mockObject 指定该行为对应的 Mock 对象的名称(Mock 对象必须在 <mockObject> 中定义过),method 属性则指定Mock对象中预期调用的方法。<mockBehavior> 的子元素<paramValues>包含了需要配置的方法所对应的参数列表。<paramValues>的每个子元素<paramValue>都包含两个属性:type和value,分别指定了参数类型和参数值。
我们以 ResultSet 接口的 Mock 对象 mockResultSet 为例,如果我们期望对 getString 方法进行调用,可以配置以下信息:
<mockBehavior mockObject="mockResultSet" method="getString">
<paramValues>
<paramValue type="int" value="1" />
</paramValues>
......
</mockBehavior>