`
regbin
  • 浏览: 56502 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
  • 关键词:如何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总结

      即使方法只有一个简单的逻辑,也有编写测试的必要。测试应该覆盖各种边界条件和正常情况,确保代码在不同输入下的表现。 4. **Mock的原因**: - 依赖单元可能已经有自己的单元测试。 - 某些依赖在测试环境中不易...

      JMockit学习分享

      在此示例中,我们首先使用`@Mocked`注解创建了一个`UserRepository`的mock对象,并使用`@Tested`注解指定了被测试的`UserService`类。接下来,我们定义了一个`Expectations`块来记录预期行为,然后调用`userService....

      JMockit基础教程

      2. **状态导向(State-oriented)**:使用`MockUp&lt;GenericType&gt;`类来改变类的实例状态。这种方式允许对类的行为进行全局修改,而不局限于特定方法的期望。 JMockit的一个显著优点是其简洁的API,它避免了传统Mock...

      jmockit中文教程

      JMockit的核心能力在于其能够模拟(Mock)和伪装(Stub)Java类中的方法,从而使得开发者能够在隔离环境中测试代码,无需依赖于实际的系统组件。 #### 开发人员测试和测试独立 软件开发过程中,编写高质量的测试...

      jmockit-1.2

      2. **创建测试类**:创建一个JUnit测试类,然后使用`@Test`注解标记测试方法。在测试方法内部,使用`@Mocked`或`@Injectable`注解声明mock对象。 3. **定义模拟行为**:使用`new Expectations()`块来定义模拟行为,...

      jmock-1.2.0-jars.rar

      在 JMock 中,模拟对象是类的一个实例,它代替了真实对象在测试中的角色。你可以设置模拟对象的行为,例如返回特定值或抛出异常,以此来控制测试环境。通过这种方式,你可以专注于测试单个组件的行为,而不是整个...

    Global site tag (gtag.js) - Google Analytics