51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3311|回复: 1
打印 上一主题 下一主题

急救!~!~关于jmock-2.3.0

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-10-7 20:17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾:今天小弟初试jmock-2.3.0,就遇到棘手的问题(忒郁闷了!)。请各位大虾救救,下面是原代码
[size=75%]
[size=75%]import org.jmock.*;
[size=75%]import javax.servlet.http.*;
[size=75%]
[size=75%]public class MockRequestTest extends MockObjectTestCase{
[size=75%]
[size=75%]    public void testMockRequest1(){
[size=75%]
[size=75%]  // [size=75%]构造一个[size=75%] Mock [size=75%]对象
[size=75%]Mock mock = new Mock(HttpServletRequest.class);
[size=75%]
[size=75%] // [size=75%]设置要执行的操作,以下设置表示要调用一次[size=75%] HttpServletRequest [size=75%]对象的

[size=75%] //getParameter [size=75%]方法,传递的参数是[size=75%] name, [size=75%]期望的返回是[size=75%] kongxx

[size=75%]  mock.expects(once()).method(getParameter).with(eq(name)).will(returnValue(kongxx));
[size=75%] // [size=75%]根据[size=75%] Mock [size=75%]对象获取一个[size=75%] HttpServletRequest [size=75%]对象

[size=75%] HttpServletRequest request = (HttpServletRequest)mock.proxy();
[size=75%]
// [size=75%]断言调用结果
[size=75%]     assertEquals(kongxx ,request.getParameter(name));         

[size=75%] }

为什么我构造一个[size=75%] Mock [size=75%]对象却没有构造成功。
它提示我先要新建一个Mock类 。我很郁闷!,不会真是要新建一个吗?

(我用的工具是eclipse3.2 /junit3.8/jmock-2.3.0-jars)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-10-8 14:30:41 | 只看该作者

回复 1# 的帖子

我们就简单测试一些 HttpServletRequest 的 getParameter方法来简单看一些 EasyMock 与 JMock 在Mock 上的区别:

我们先看看在JMock 中的一个简单的 TestCase:

package cn.allanchanly.test.jmock;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit3.MockObjectTestCase;

public class HttpServletMockTest extends MockObjectTestCase {
    private static Logger log = Logger.getLogger(cn.allanchanly.test.jmock.HttpServletMockTest.class);
   
    private Mockery m = new Mockery();
    private HttpServletRequest test;
   
    protected void setUp()throws Exception{
        test = m.mock(HttpServletRequest.class);
    }
   
    protected void tearDown()throws Exception{
      
    }
   
    public void testServlet(){
        m.checking(new Expectations(){{
            one(test).getParameter("userName");will(returnValue("allanchanly"));
            allowing(test).getParameter("password");will(returnValue("allanchanly-password"));
        }           
        });
      
        log.debug(test.getParameter("userName"));
        log.debug(test.getParameter("password"));
      
        m.assertIsSatisfied();
      
//        log.debug(test.getParameter("userNamexxx"));
    }
}



然后我们再看看利用EasyMock 怎样做,最后我们会总结一下:

package cn.allanchanly.test.easymock;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import junit.framework.TestCase;

import static org.easymock.EasyMock.*;

public class TestRequestByEasyMock extends TestCase {
    private static Logger log = Logger.getLogger(cn.allanchanly.test.easymock.TestRequestByEasyMock.class);
   
    private HttpServletRequest mockRequest;
   
    protected void setUp() throws Exception {
        super.setUp();
        log.debug("we set up to test HttpServletRequest by EasyMock!");
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testGetparameter(){
        mockRequest = createMock(HttpServletRequest.class);
        expect(mockRequest.getParameter("userName")).andReturn("allanchanly");
        expectLastCall().times(2);
        replay(mockRequest);
        log.debug(mockRequest.getParameter("userName"));
        assertTrue(mockRequest.getParameter("userName").equals("allanchanly"));   
        verify(mockRequest);
    }
}



我们将关键代码写在这里:

在JMock中我们这样写:

private Mockery m = new Mockery();

private HttpServletRequest test;

test = m.mock(HttpServletRequest.class);

m.checking(new Expectations(){{
            one(test).getParameter("userName");will(returnValue("allanchanly"));
            allowing(test).getParameter("password");will(returnValue("allanchanly-password"));
        }     

log.debug(test.getParameter("password"));
      
m.assertIsSatisfied();   

而在EasyMock中我们这样写:

private HttpServletRequest mockRequest;

mockRequest = createMock(HttpServletRequest.class);

expect(mockRequest.getParameter("userName")).andReturn("allanchanly");
expectLastCall().times(2);
replay(mockRequest);
log.debug(mockRequest.getParameter("userName"));
assertTrue(mockRequest.getParameter("userName").equals("allanchanly"));   
verify(mockRequest);

简单的总结一下:

在JMock中我们首相构建一个Mockery 对象,然后去mock 一个class(待测试或者需要的特定类,这个类一般需要特定的容器才能提供,我们在这里Mock模拟一下)

然后我们利用Mockery.checking()给其中传递一个Expectations,利用匿名类组织我们的Expectation,其中什么one(),allowing(),will(),returnValue()阿都是常用来的模拟行为的。

然后我们就直接测试或者利用我们构建的行为了,其实我认为一般还是利用,比如你要测试自己的Servlet,需要一个Request,没有人在哪儿把一个Request 测着玩的。

而在EasyMock中其实差不多,代码稍有不同而已,由于采用了静态引入(import static )所以EasyMock中的方法我们可以直接使用, 一般过程还是先 createMock 一个class,然后开始定制我们的expect,其实就是“录制”一系列我们需要的行为,比如调用哪个方法,返回什么值等,或者哪个方法调用几次等,然后replay(Mock对象),重新放映我们的行为,测试方法,最后别忘了还有个verify(mock对象)来检验一下,
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-14 13:21 , Processed in 0.065785 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表