我们仍然用ResultSet接口的 Mock 对象为例,如果希望方法mockResult.getString(1)的返回值为 "My return value",那么你可以使用以下的语句: mockResultSet.getString(1); expectLastCall().andReturn("My return value");
以上的语句表示mockResultSet的getString方法被调用一次,这次调用的返回值是 "My return value"。有时,我们希望某个方法的调用总是返回一个相同的值,为了避免每次调用都为 Mock 对象的行为进行一次设定,我们可以用设置默认返回值的方法: void andStubReturn(Object value);
假设我们创建了Statement和ResultSet接口的 Mock 对象 mockStatement 和 mockResultSet,在测试过程中,我们希望 mockStatement 对象的executeQuery方法总是返回 mockResultSet,我们可以使用如下的语句 mockStatement.executeQuery("SELECT * FROM sales_order_table"); expectLastCall().andStubReturn(mockResultSet);
EasyMock 在对参数值进行匹配时,默认采用Object.equals()方法。因此,如果我们以"select * from sales_order_table"作为参数,预期方法将不会被调用。如果您希望上例中的 SQL 语句能不区分大小写,可以用特殊的参数匹配器来解决这个问题,我们将在 "在 EasyMock 中使用参数匹配器" 一章对此进行说明。
设定预期异常抛出
对象行为的预期输出除了可能是返回值外,还有可能是抛出异常。IExpectationSetters提供了设定预期抛出异常的方法: IExpectationSetters<T> andThrow(Throwable throwable);
和设定默认返回值类似,IExpectationSetters接口也提供了设定抛出默认异常的函数: void andStubThrow(Throwable throwable);
设定预期方法调用次数
通过以上的函数,您可以对 Mock 对象特定行为的预期输出进行设定。除了对预期输出进行设定,IExpectationSetters接口还允许用户对方法的调用次数作出限制。在IExpectationSetters所提供的这一类方法中,常用的一种是times方法: IExpectationSetters<T>times(int count);
该方法可以 Mock 对象方法的调用次数进行确切的设定。假设我们希望 mockResultSet 的getString方法在测试过程中被调用3次,期间的返回值都是 "My return value",我们可以用如下语句: mockResultSet.getString(1); expectLastCall().andReturn("My return value").times(3);
注意到andReturn和andThrow方法的返回值依然是一个IExpectationSetters实例,因此我们可以在此基础上继续调用times方法。
除了设定确定的调用次数,IExpectationSetters还提供了另外几种设定非准确调用次数的方法:
times(int minTimes, int maxTimes):该方法最少被调用 minTimes 次,最多被调用 maxTimes 次。
atLeastOnce():该方法至少被调用一次。
anyTimes():该方法可以被调用任意次。
某些方法的返回值类型是 void,对于这一类方法,我们无需设定返回值,只要设置调用次数就可以了。以ResultSet接口的close方法为例,假设在测试过程中,该方法被调用3至5次: mockResultSet.close(); expectLastCall().times(3, 5);
为了简化书写,EasyMock 还提供了另一种设定 Mock 对象行为的语句模式。对于上例,您还可以将它写成: expect(mockResult.close()).times(3, 5);
这个语句和上例中的语句功能是完全相同的。
将 Mock 对象切换到 Replay 状态
在生成 Mock 对象和设定 Mock 对象行为两个阶段,Mock 对象的状态都是 Record 。在这个阶段,Mock 对象会记录用户对预期行为和输出的设定。
在使用 Mock 对象进行实际的测试前,我们需要将 Mock 对象的状态切换为 Replay。在 Replay 状态,Mock 对象能够根据设定对特定的方法调用作出预期的响应。将 Mock 对象切换成 Replay 状态有两种方式,您需要根据 Mock 对象的生成方式进行选择。如果 Mock 对象是通过org.easymock.EasyMock类提供的静态方法 createMock 生成的(第1节中介绍的第一种 Mock 对象生成方法),那么EasyMock类提供了相应的 replay 方法用于将 Mock 对象切换为 Replay 状态: replay(mockResultSet);
如果 Mock 对象是通过IMocksControl接口提供的createMock方法生成的(第1节中介绍的第二种Mock对象生成方法),那么您依旧可以通过IMocksControl接口对它所创建的所有 Mock 对象进行切换: control.replay();
以上的语句能将在第1节中生成的 mockConnection、mockStatement 和 mockResultSet 等3个 Mock 对象都切换成 Replay 状态。
文章来源于领测软件测试网 https://www.ltesting.net/