有时候候为了测试控制层或业务层通常我们要模拟个别对象,屏蔽对这些对象的依懒。如我们测试struts1.x的时候,象HttpservletRequest等对象是由容器创建的,要测试控制层,通常我们要启动容器(一般情况下也是启动容器进行测试)。但是我们也可以用EasyMock模拟HttpServletRequest出等对象(spring已提供类似的模拟对象MockHttpServletRequest) 实现struts1.x控制层测试.
而通常,EasyMock用得更多在业务层上的测试。通常业务层依懒于DAO层,我们可以用EasyMock模拟Dao对象,屏蔽对DAO依懒。好废话少说了。进入正题。
EasyMock提供对接口,类的模拟(以前要通过EasyMock扩展包才支持),能够通过录制、回放、检查三步来完成大体的测试过程。
对HttpServletRequest的模拟:
public class TestMockHttpServletRquest {
IMocksControl control = EasyMock.createControl();
HttpServletRequest request = null;
HttpSession session = null;
@Before
public void setUp() {
request = control.createMock(HttpServletRequest.class); //创建模拟对象
session = control.createMock(HttpSession.class);////创建模拟对象
}
@Test
public void testWeb() { //录制
EasyMock.expect(request.getParameter("name")).andReturn("landy");
//总是返回模拟的对象
EasyMock.expect(request.getSession()).andStubReturn(session);
EasyMock.expect(session.getAttribute("name")).andReturn("landy");
control.replay(); //回放
String name=request.getParameter("name");
System.out.println(name);
HttpSession session2 =request.getSession();
String landy=(String)session.getAttribute("name");
System.out.println("landy:"+landy);
Assert.assertEquals(landy, name);
}
@After
public void tearDown() {
control.verify(); // 验证
}
HttpRequestServlet 等对象比较复杂, 完成用easyMock对这些对象的模拟,EasyMock的一些基本用法就掌握了。
EasyMock也可以用来模拟类.
写道
public class BeanService { //被模拟的类
/* (non-Javadoc)
* @see com.landyyan.test.IbeanService#testMock()
*/
public String testMock() { //有返值方法
return "hello222222";
}
public void save() { //没有返回值 方法
System.out.println();
System.out.println("sssss");
}
/* (non-Javadoc)
* @see com.landyyan.test.IbeanService#testMock()
*/
public String testMock() { //有返值方法
return "hello222222";
}
public void save() { //没有返回值 方法
System.out.println();
System.out.println("sssss");
}
测试类:
public class TestBeanService {
private IMocksControl control = EasyMock.createControl();
private BeanService service = null;
@Before
public void setUp() {
service = control.createMock(BeanService.class);
}
@Test
public void testSayHi() {
EasyMock.expect(service.testMock()).andReturn("hello22").andReturn("sss222");
//第一次调用,返回“hello22”, 第二次调用,返回sss222
control.replay();
//若是其它Service 将模拟出的Dao对象set到业务层中,然后调用即可
System.out.println(service.testMock());
System.out.println(service.testMock());
}
@After
public void testAfter() {
control.verify();
}
}