Grails 单元测试之: Spock

Spock

  • Spock简介

    • Spock是一个面向java和groovy的测试框架
    • Spock的实现是基于groovy
    • Spock的简洁高效表达式使得Spock的使用起来极其容易
  • 例子:

    每个测试类都是继承自 Specification,类名必须要以“Spec” 或者 “Specification”结尾。代码如下:

    class MyFirstSpecification extends Specification {
    }

  • 自带的方法:

    • def setup() {} //在所有方法执行之前执行
    • def cleanup() {} //在每个方法执行之后执行
    • def setupSpec() {} //在第一个方法执行之前执行
    • def cleanupSpec() {} //在最后一个方法执行之后执行
  • 自然语义的执行流程:

    • setup

    • when //for stimulus

    • then //output comparison

    • expect

    • where

      when:
      stack.push(elem)
      then:
      !stack.empty()
      stack.size()== 1
      stack.peel() == elem

  • Mock对象

    • 一个controller对应的单元测试里面,可以像如下一样mock一个service

      def accountServiceMock = Mock(ContentService)
      controller.contentService = accountServiceMock

    • 可以改变mock对象上某个方法的返回值

      def accountServiceMock = Mock(ContentService)
      accountServiceMock.getAccountId() >> "2015"
      controller.contentService = accountServiceMock

    • “mock”一个方法的兄弟方法,比如方法 "fun1()" 和 “fun2()” 都是在同一个controller里面,而且在fun1()里面会调用到 fun2(),当我们写fun1()的单元测试的时候,就可以mock一下fun2()来保持单元测试的纯洁性,代码如下:

      void "test fun1()"{
      setup:
      controller.metaClass.fun2() = {name -> "Hello ${name}"}
      when:
      controller.fun1()
      then:
      1 == 1
      }

  • Spy

    • 可以hack一个对象的属性和方法:

      def person = Spy(Person, name: "myPerson")
      // type is Person.class, name is "myPerson"

      def person = Spy(Person) {
      name << "Allen"
      1 * sing()
      }

  • 判断一个方法被调用的次数:

    1 * controller.fun1()

  • 测试相关的初始化工作:

    • 真实的去读取grails项目中的配置

      new GrailsPlaceholderConfigurer(grailsApplication).postProcessBeanFactory(applicationContext.beanFactory)

    • 如果该项目是一个 插件,配置项需要依附于其他项目,那么当我们单独测试这个插件的时候,我们需要“mock"插件用到的配置项:

      def setupSpec() {

      MockPropertySource mockEnvVars = new MockPropertySource()
      .withProperty("layout.name", "testLayout")
      .withProperty("poj.id", '2015');

      def propertySources = new MutablePropertySources()
      propertySources.addLast(mockEnvVars)

      def configurer = new GrailsPlaceholderConfigurer(grailsApplication)
      configurer.setPropertySources(propertySources)
      configurer.postProcessBeanFactory(applicationContext.beanFactory)
      }

posted @ 2015-06-24 23:25  egg_lee  阅读(1114)  评论(0)    收藏  举报