JMockit使用实例<一>mock一个类的方法、Expectations

6 篇文章 0 订阅
5 篇文章 0 订阅
关键词:如何mock一个类的方法、Expectations 源类清单

 

/**
 * 演示如何mock一个类的方法
 * @sina weibo:regbin@tom.com
 */
public class DateUtil {

    private int type;

    public static final String getCurrentDateStr() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(DateUtil.now());
    }

    public static final String getCurrentDateStrByFormatType(int type) {
        if (type == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            return sdf.format(DateUtil.now());
        } else {
            return DateUtil.getCurrentDateStr();
        }
    }

    public static final Date now() {
        return new Date();
    }

    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }

}
  •  单元测试类清单
/**
 * 演示如何mock一个类的方法
 */
public class DateUtilTest {

    /**
     * Mock某个类方法
     */
    @Test
    public void testGetCurrentDateStr() {
        //DateUtil.class,要Mock的类
        new Expectations(DateUtil.class) {
            {
              //要Mock的方法now,其他方法DateUtil.class
                DateUtil.now();
              //期望方法返回的结果
                result = mockDate();
            }
        };
        Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStr());
    }

    /**
     * Mock 某个类方法根据不同参数返回不同值
     */
    @Test
    public void testGetCurrentDateStrByFormatType() {
        new Expectations(DateUtil.class) {
            {
                DateUtil.getCurrentDateStrByFormatType(anyInt);
                result = new Delegate() {
                    public String getCurrentDateStrByFormatType(int type) {
                        if (type == 1) {
                            return "2010/07/22 15:52:55";
                        } else {
                            return "2010-07-22 15:52:55";
                        }
                    }
                };
            }
        };
        Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStrByFormatType(2));

    }

    public static Date mockDate() {
        Calendar c = Calendar.getInstance();
        c.set(2010, 6, 22, 15, 52, 55);
        return c.getTime();
    }

}
  •  小结

Expectations:一个Expectations块是给定测试方法中将会涉及到的mock项中,预期将要被调用的方法或构造函数。一个Expectations可以包含多个预期的要执行方法(mock),但不必包含所有预期会被调用的方法。在Expectations中;除了可以指定预期的方法外,还可以指定方法的参数的精确值或约束行为(满足某个断言);同时Expectations中还可以指定该方法预期的返回值(如果有)或预期抛出的异常。Expectations(.class){}这种方式只会模拟区域中包含的方法,这个类的其它方法将按照正常的业务逻辑运行,上面的例子,定义了一个mock类DateUtil,同时在Expectation中定义了预期会被调用的方法now,以及now方法的返回值,这种方式还有种等价实现方式,使用@Mocked标签

 

@Test
    public void testGetCurrentDateStr(@Mocked(methods="now")DateUtil dateUtil) {
        //DateUtil.class,要Mock的类
        new Expectations() {
            {
                //声明要Mock的方法(注:其它方法按照正常的业务逻辑运行)
                DateUtil.now();
                //期望方法返回的结果
                  result = mockDate();
            }
        };
        Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStr());
    }

 

NonStrictExpectations:Expectations块里声明的mock方法,是一定要被执行的,如果没有被执行,会认为整个测试case不通过;NonStrictExpectations就没有这个限制,看例子:

 

@Test
    public void testGetCurrentDateStr(@Mocked(methods="now")DateUtil dateUtil) {
        //DateUtil.class,要Mock的类
        new NonStrictExpectations() {
            {
                //声明要Mock的方法(注:其它方法按照正常的业务逻辑运行)
                DateUtil.now();
                //期望方法返回的结果
                  result = mockDate();
                DateUtil.getType();
                result = 1;
            }
        };
        Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStr());
    }

 

DateUtil.getType()在后面的断言没用被调用,但也不会出错,但是如果把NonStrictExpectations换成Expectations,就会出错,在Expectations情况必须把

 

DateUtil.getType();
 result = 1;

 

给删除掉,上述就是二者的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值