使用Mock Object进行测试

    技术2022-05-11  63

    使用Mock Object进行测试 作者:kongxx MockObject概述 使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。 目前,在Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock等。 以下就对在Java中使用的Mock Object进行测试的常用工具做一下使用说明。 JMock 简介 请访问 http://www.jmock.org。 准备 1.        获取J2SDK; 2.        获取JUnit V3.8.1(从 http://www.junit.org获取开发包); 3.        获取JMock V1.0(从http://www.jmock.org获取JMock开发包)。 4.        为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。 例子一 以下是一个简单例子,代码如下: package test1;   import org.jmock.*; import javax.servlet.http.*;   public class MockRequestTest extends MockObjectTestCase{        public void testMockRequest1(){               //构造一个Mock对象         Mock mock = new Mock(HttpServletRequest.class);                 //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的         //getParameter方法,传递的参数是"name",期望的返回是"kongxx"         mock.expects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));                 //根据Mock对象获取一个HttpServletRequest对象         HttpServletRequest request = (HttpServletRequest)mock.proxy();                 //断言调用结果         assertEquals("kongxx" ,request.getParameter("name"));            }        public void testMockRequest2(){               //构造一个Mock对象         Mock mock = new Mock(HttpServletRequest.class);                 //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的         //getParameter方法,传递的参数是"name",期望的返回是"kongxx"         mock.expects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));                 //根据Mock对象获取一个HttpServletRequest对象         HttpServletRequest request = (HttpServletRequest)mock.proxy();                 //调用HttpServletRequest对象的方法         request.getParameter("name");                        //验证执行结果         mock.verify();     } } 编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。 例子二 MyClass需要测试的类,提供了两个方法getName和getPassword,都使用HttpServletRequest作为输入参数并返回从HttpServletRequest中取得的参数,具体代码如下: package test2;   import javax.servlet.http.*;   public class MyClass {        public String getName(HttpServletRequest request) {               return request.getParameter("name");        }               public String getPassword(HttpServletRequest request) {               return request.getParameter("password");        } } TestMyClass测试类,其中构造了一个假的HttpServletRequest对象,用来测试MyClass中的getName和getPassword方法,代码如下: package test2;   import org.jmock.*; import javax.servlet.http.*;   public class TestMyClass extends MockObjectTestCase{        private MyClass myclass ;        private Mock mockRequest ;        private HttpServletRequest request ;               public void setUp() {                      myclass = new MyClass();                             //构造一个Mock对象               mockRequest = new Mock(HttpServletRequest.class);                             //根据Mock对象获取一个HttpServletRequest对象               request = (HttpServletRequest)mockRequest.proxy();        }        public void tearDown() {               //TODO        }        public void testGetName(){               //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的         //getParameter方法,传递的参数是"name",期望的返回是"kongxx"                            mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));                             assertNotNull(myclass.getName(request));         assertEquals("kongxx" ,myclass.getName(request));              }        public void testGetPassword(){               //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的         //getParameter方法,传递的参数是"password",期望的返回是"123456789"                    mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("password")).will(returnValue("123456789"));                             assertNotNull(myclass.getPassword(request));         assertEquals("123456789" ,myclass.getPassword(request));        } } 编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。 小结EasyMock 简介 请访问 http://www.easymock.org。 准备 1.        获取J2SDK; 2.        获取JUnit V3.8.1(从 http://www.junit.org获取开发包); 3.        获取EasyMock V1.1(从http://www.easymock.org获取EasyMock开发包)。 4.        为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。 例子一 以下是一个简单例子,为了方便对比,这里重新实现了 JMock例子一,代码如下: package test1;   import org.easymock.*; import junit.framework.*; import javax.servlet.http.*;   public class MockRequestTest extends TestCase{     private MockControl control;     private HttpServletRequest mockRequest;          public void testMockRequest(){               //创建一个Mock HttpServletRequest的MockControl对象               control = MockControl.createControl(HttpServletRequest.class);                             //获取一个Mock HttpServletRequest对象               mockRequest = (HttpServletRequest) control.getMock();                                    //设置期望调用的Mock HttpServletRequest对象的方法               mockRequest.getParameter("name");                             //设置调用方法期望的返回值,并指定调用次数               //以下后两个参数表示最少调用一次,最多调用一次               control.setReturnValue("kongxx" ,1 ,1);                                   //设置Mock HttpServletRequest的状态,               //表示此Mock HttpServletRequest对象可以被使用               control.replay();                             //使用断言检查调用               assertEquals("kongxx",mockRequest.getParameter("name"));                             //验证期望的调用               control.verify();     } } 编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。 例子二 同例子一样,对 JMock例子二重新实现产生了EasyMock的例子二。 需要测试的类代码如下: package test2;   import javax.servlet.http.*;   public class MyClass {        public String getName(HttpServletRequest request) {               return request.getParameter("name");        }               public String getPassword(HttpServletRequest request) {               return request.getParameter("password");        } } 测试类代码如下: package test2;   import org.easymock.*; import junit.framework.*; import javax.servlet.http.*;   public class TestMyClass extends TestCase{            private MockControl control;     private HttpServletRequest mockRequest;     private MyClass myclass ;               public void setUp() {                      myclass = new MyClass();                             //创建一个Mock HttpServletRequest的MockControl对象               control = MockControl.createControl(HttpServletRequest.class);                             //获取一个Mock HttpServletRequest对象               mockRequest = (HttpServletRequest) control.getMock();                     }        public void tearDown() {               //TODO        }        public void testGetName(){               //设置期望调用的Mock HttpServletRequest对象的方法               mockRequest.getParameter("name");                             //设置调用方法期望的返回值,并指定调用次数               //以下后两个参数表示最少调用一次,最多调用一次               control.setReturnValue("kongxx" ,1 ,2);                                   //设置Mock HttpServletRequest的状态,               //表示此Mock HttpServletRequest对象可以被使用               control.replay();                             //使用断言检查调用               assertNotNull(myclass.getName(mockRequest));               assertEquals("kongxx",myclass.getName(mockRequest));                             //验证期望的调用               control.verify();           }        public void testGetPassword(){               //设置期望调用的Mock HttpServletRequest对象的方法               mockRequest.getParameter("password");                             //设置调用方法期望的返回值,并指定调用次数               //以下后两个参数表示最少调用一次,最多调用一次               control.setReturnValue("kongxx" ,1,2);                             //设置Mock HttpServletRequest的状态,               //表示此Mock HttpServletRequest对象可以被使用               control.replay();                             //使用断言检查调用               assertNotNull(myclass.getPassword(mockRequest));               assertEquals("kongxx",myclass.getPassword(mockRequest));                             //验证期望的调用               control.verify();          } } 编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。  

    最新回复(0)