gmock初体验

       GMock是groovy环境下的mock解决方法。使用它可以很轻松的完成groovy的单元测试工作。它能够很好的模拟对象,辅助junit完成单元测试。

       下面,就先来看一下最简单的使用的GMock代码,然后在给出详细的说明。

       

        使用Gmock主要分为以下几个步骤:

  1. 测试类需要继承自GMockTestCase,或者是使用Annotation的方式——在类声明处使用@WithGMock
  2. 创建GMockController对象,调用其mock()方法,创建一个需要模拟的对象。
  3. 通过调用方法,设置期望的输入值和期望的返回值。上述代码中,期望调用方法是load(),在输入参数为'key'的条件下期望的返回值是'value',使用returns()实现
  4. 在GMockController对象上调用play闭包,完成需要的断言。

        需要对上述问题做几点说明。使用GMock有两种方法:要么继承自GMockTestCase;要么使用@WithGMock注解。这两种方法在使用上有所区别。如果继承自GMockTestCase,那么在这父类中已经定义了mock()和play()方法。这样就不需要使用GMockController对象了。反之,如果使用注解,就示例代码所示,需要自己定义GMockController对象了。

        继承自GMockTestCase的代码形式如下:

       

        其实示例代码看上去是很怪异的。看一下变量mockLoader,它是什么类型的呢?不知道!它可以指向一个已存在的数据类型,也可以指向一个未知的数据类型。我们所关注的,就是在这个对象上,期望调用一个load方法,在参数为'key'的情况下获得一个'value'的返回值。也许这个方法也是不存在的。

 

      (一)模拟强类型对象

        为什么会出现上面说的那种怪异的情况的?因为groovy的弱类型语言。同样,GMock也同样支持像Java一样的强类型。示例如下:

       

        在mock()方法中,接受一个可选参数,也就是需要模拟的类型。同时,如果要模拟的类型需要使用构造函数,则可以通过constructor()来指明构造函数

 

      (二)模拟异常类型

        通常情况下,异常类型在单元测试中很难获得。在这里可以使用raises()来模拟异常类型。

       

 

      (三)模拟静态方法调用

        对于静态方法,可以在没有对象的情况下直接使用类名调用,下面就给出示例代码

       

 

      (四)模拟构造函数

        

       之前已经给出了模拟构造函数和模拟异常类型的方法,这里综合使用一下。在构建构造函数时会抛出异常。在play闭包中使用shouldFail来判定。

 

     (五)多次模拟

       对于一些特定方法,有可能需要调用多次。如果多次重复设置会产生不必要的麻烦,可以通过相应的方法来设置模拟次数

      

       这里的atLeastOnce()表示该方法至少会被调用一次。还有如下几种方法用来设置调用次数

     (七)方法的正则表达方式模拟     

          如果一些需要模拟的方法名有一些规则,可以使用正则表达式匹配的方法批量模拟。

      

 

     (八)认模拟

       Gmock认实现了equals()、hashCode()和toString()的模拟。

  • never() 从来不被调用
  • once() 认情况,只被调用一次
  • atLeastOnce() 至少被调用一次
  • atMostOnce() 最多一次(0或1)
  • stub() the expectation can be called anytime
  • times(n) 被调用n次。
  • times(m..n) 被调用m-n次。
  • atLeast(n)调用至少n次
  • atMost(n)调用至多n次

     (六)顺序调用

       如果一些方法的执行顺序有严格的要求,可以使用ordered方法来确定方法调用顺序

      

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...