- 关键词:如何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;
给删除掉,上述就是二者的区别
JMockit使用:mock一个类的方法
最新推荐文章于 2024-07-24 17:24:29 发布