zoukankan      html  css  js  c++  java
  • 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)
          }
    老司机带你飞
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/egg-lee/p/4598942.html
Copyright © 2011-2022 走看看