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)
          }
    老司机带你飞
  • 相关阅读:
    MVC4数据访问EF查询linq语句的时候报错找不到表名问题
    以下各节已定义,但尚未为布局页“~/Views/Shared/_Layout.cshtml”呈现:“Scripts”。
    将函数实现放在头文件中
    const 不兼容的类型限定符问题
    Ubuntu 16.04重装后grub rescue> 终端模式修复方法
    Ubuntu 16.04 编译VTK7.1
    区域生长算法的一种C++实现
    Win7 U盘安装Ubuntu16.04 双系统
    Win7、Ubuntu双系统卸载Ubuntu系统
    AES加密补位填充的一个问题
  • 原文地址:https://www.cnblogs.com/egg-lee/p/4598942.html
Copyright © 2011-2022 走看看