参考:http://solnone.blogspot.com/search/label/Java
mock,就是假的意思。easymock或者jmock之类的框架最常用于减少外部重量级资源依赖。
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
importjava.util.List;
publicclassDBImpl {
publicListquery(Connection conn)throwsSQLException {
Listlist=newArrayList();
PreparedStatement ps = conn.prepareStatement("select user from user");
try{
ResultSet rs = ps.executeQuery();
try{
while(rs.next()) {
list.add(rs.getString(1));
}
}finally{
rs.close();
}
}finally{
ps.close();
}
returnlist;
}
}
importstaticorg.easymock.EasyMock.createControl;
importstaticorg.easymock.EasyMock.expect;
importstaticorg.easymock.EasyMock.matches;
importstaticorg.junit.Assert.assertEquals;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.Arrays;
importjava.util.List;
importorg.easymock.IMocksControl;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclassDBImplTest {
privateDBImpldbimpl;
@Before
publicvoidsetUp()throwsException {
dbimpl=newDBImpl();
}
@After
publicvoidtearDown()throwsException {
dbimpl=null;
}
@Test
publicvoidtestQuery()throwsSQLException {
IMocksControl control =createControl();
//建立模擬物件
Connection conn = control.createMock(Connection.class);
PreparedStatement ps = control.createMock(PreparedStatement.class);
ResultSet rs = control.createMock(ResultSet.class);
//模擬物件預期行為
expect(conn.prepareStatement(matches("select user from user")))
.andReturn(ps);
expect(ps.executeQuery()).andReturn(rs);
expect(rs.next()).andReturn(true);
expect(rs.getString(1)).andReturn("root");
expect(rs.next()).andReturn(true);
expect(rs.getString(1)).andReturn("tester");
expect(rs.next()).andReturn(true);
expect(rs.getString(1)).andReturn("中文");
expect(rs.next()).andReturn(false);
rs.close();
ps.close();
//錄製完成,切到replay狀態
control.replay();
//調用方法
Listexpected = Arrays.asList(newString[]{"root","tester","中文"});
//这个conn是假的
List result =dbimpl.query(conn);
assertEquals(expected, result);
//驗證
control.verify();
}
}
CLASSPATH加入easymock.jar,cglib-2.2.jar以及easymockclassextension.jar.
调试上述程序,dbimpl.query(conn)如期执行真正的查询操作,无须建立真正的数据库联接。