JMockit使用:mock一个类的方法

  • 关键词:如何mock一个类的方法、Expectations
  • 源类清单

     

    Java代码  
    1. /** 
    2.  * 演示如何mock一个类的方法 
    3.  * @sina weibo:[email protected] 
    4.  */  
    5. public class DateUtil {  
    6.   
    7.     private int type;  
    8.   
    9.     public static final String getCurrentDateStr() {  
    10.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    11.         return sdf.format(DateUtil.now());  
    12.     }  
    13.   
    14.     public static final String getCurrentDateStrByFormatType(int type) {  
    15.         if (type == 1) {  
    16.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
    17.             return sdf.format(DateUtil.now());  
    18.         } else {  
    19.             return DateUtil.getCurrentDateStr();  
    20.         }  
    21.     }  
    22.   
    23.     public static final Date now() {  
    24.         return new Date();  
    25.     }  
    26.   
    27.     public int getType() {  
    28.         return type;  
    29.     }  
    30.     public void setType(int type) {  
    31.         this.type = type;  
    32.     }  
    33.   
    34. }  
    •  单元测试类清单
    Java代码  
    1. /** 
    2.  * 演示如何mock一个类的方法 
    3.  */  
    4. public class DateUtilTest {  
    5.   
    6.     /** 
    7.      * Mock某个类方法 
    8.      */  
    9.     @Test  
    10.     public void testGetCurrentDateStr() {  
    11.         //DateUtil.class,要Mock的类  
    12.         new Expectations(DateUtil.class) {  
    13.             {  
    14.               //要Mock的方法now,其他方法DateUtil.class  
    15.                 DateUtil.now();  
    16.               //期望方法返回的结果  
    17.                 result = mockDate();  
    18.             }  
    19.         };  
    20.         Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStr());  
    21.     }  
    22.   
    23.     /** 
    24.      * Mock 某个类方法根据不同参数返回不同值 
    25.      */  
    26.     @Test  
    27.     public void testGetCurrentDateStrByFormatType() {  
    28.         new Expectations(DateUtil.class) {  
    29.             {  
    30.                 DateUtil.getCurrentDateStrByFormatType(anyInt);  
    31.                 result = new Delegate() {  
    32.                     public String getCurrentDateStrByFormatType(int type) {  
    33.                         if (type == 1) {  
    34.                             return "2010/07/22 15:52:55";  
    35.                         } else {  
    36.                             return "2010-07-22 15:52:55";  
    37.                         }  
    38.                     }  
    39.                 };  
    40.             }  
    41.         };  
    42.         Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStrByFormatType(2));  
    43.   
    44.     }  
    45.   
    46.     public static Date mockDate() {  
    47.         Calendar c = Calendar.getInstance();  
    48.         c.set(2010622155255);  
    49.         return c.getTime();  
    50.     }  
    51.   
    52. }  
    •  小结

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

     

    Java代码  
    1. @Test  
    2.     public void testGetCurrentDateStr(@Mocked(methods="now")DateUtil dateUtil) {  
    3.         //DateUtil.class,要Mock的类  
    4.         new Expectations() {  
    5.             {  
    6.                 //声明要Mock的方法(注:其它方法按照正常的业务逻辑运行)  
    7.                 DateUtil.now();  
    8.                 //期望方法返回的结果  
    9.                   result = mockDate();  
    10.             }  
    11.         };  
    12.         Assert.assertEquals("2010-07-22 15:52:55", DateUtil.getCurrentDateStr());  
    13.     }  

     

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

     

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

     

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

     

    Java代码  
    1. DateUtil.getType();  
    2.  result = 1;  

     

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

  • 你可能感兴趣的:(java,单元测试,测试,2010,methods)