EasyMock学习

[b]EasyMock Home[/b]
[list]
[*][url]http://easymock.org[/url]
[*][color=olive]easymock-2.4.jar 只能对接口进行Mock, 如果需要Mock类,则要下载easymockclassextension-2.4.jar[/color]
[/list]
[b]EasyMock 为接口动态的创建Mock对象步骤[/b]
[list]
[*][color=olive]使用EasyMock生成Mock对象[/color]
[*][color=olive]设定Mock对象的预期行为和输出[/color]
[*][color=olive]将Mock对象切换到Replay状态[/color]
[*][color=olive]调用Mock对象方法进行单元测试[/color]
[*][color=olive]对Mock对象的行为进行验证[/color]
[/list]
[b]EasyMock Test[/b]
package com.taobao;

import static com.taobao.matcher.SQLMatch.sqlMatch;
import static org.easymock.EasyMock.createControl;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.easymock.IMocksControl;
import org.junit.Test;

/**
* Jeck's EasyMock Test
*
* @author jeck.xie 2009-3-25
*/
public class EasyMockTest {

HttpServletRequest reqMock;
HttpServletResponse rspMock;

Statement mockStatement;
ResultSet mockResultSet;

@Test
public void testMock() {
// 1.使用EasyMock生成Mock对象
reqMock = createMock(HttpServletRequest.class);
rspMock = createMock(HttpServletResponse.class);
mockStatement = createMock(Statement.class);
mockResultSet = createMock(ResultSet.class);

// 2.设定Mock对象的预期行为和输出
expect(reqMock.getProtocol()).andReturn("HTTP/1.1").times(1);
expect(reqMock.getMethod()).andReturn("GET"); //调用次数 times(1) default
expect(reqMock.getParameter("jeck.key")).andReturn("jeck.value");
expect(rspMock.getLocale()).andThrow(new RuntimeException()).anyTimes();
rspMock.getContentType();
expectLastCall().andReturn("text/xml;charset=UTF-8").atLeastOnce();

try {
// 参数匹配器
mockStatement.executeQuery(sqlMatch("SELECT * FROM mytable"));
expectLastCall().andStubReturn(mockResultSet);
} catch (SQLException e) {
e.printStackTrace();
}

// 3.将Mock对象切换到 Replay状态
replay(reqMock, rspMock);

// 4.调用Mock对象方法进行单元测试
assertEquals(rspMock.getContentType(), "text/xml;charset=UTF-8");
assertEquals(reqMock.getMethod(), "GET");
assertEquals(reqMock.getParameter("jeck.key"), "jeck.value");
assertEquals(reqMock.getProtocol(), "HTTP/1.1");

// 5.对Mock对象的行为进行验证
verify(reqMock, rspMock);
}

/**
* 用IMocksControl创建、管理Mock对象
*/
@Test
public void testIMocksControl() {
// 1.用IMocksControl创建多个Mock对象
IMocksControl control = createControl();
reqMock = control.createMock(HttpServletRequest.class);
rspMock = control.createMock(HttpServletResponse.class);
mockStatement = control.createMock(Statement.class);
mockResultSet = control.createMock(ResultSet.class);

// 3.将IMocksControl接口生成的Mock对象全部切换成Replay状态
control.replay();

// 5.同上
control.verify();
}

}

package com.taobao.matcher;

import static org.easymock.EasyMock.reportMatcher;

import org.easymock.IArgumentMatcher;

/**
* 在EasyMock中使用参数匹配器<br>
* 自定义参数匹配器
*
* @author jeck.xie 2009-3-25
*/
public class SQLMatch implements IArgumentMatcher {

private String regSQL = null;

public SQLMatch(String expectedSQL) {
this.regSQL = expectedSQL;
}

public void appendTo(StringBuffer buffer) {
buffer.append("sqlMatch(\"" + regSQL + "\")");
}

public boolean matches(Object matchSQL) {
if (matchSQL == null && regSQL == null)
return true;
else if (matchSQL instanceof String)
return regSQL.equalsIgnoreCase((String) matchSQL);
else
return false;
}

public static String sqlMatch(String in) {
reportMatcher(new SQLMatch(in));
return in;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值