Grails 单元测试之: Spock

本文详细介绍了Spock测试框架的使用,包括其基于Groovy的实现方式、简洁高效的表达式、测试类的继承规则、内置方法、自然语义执行流程、Mock与Spy对象的应用,以及如何在Grails项目中进行测试相关的初始化工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
        }

转载于:https://www.cnblogs.com/egg-lee/p/4598942.html

Rebuild started: Project: Project *** Using Compiler &#39;V6.22&#39;, folder: &#39;E:\Keil_v5\ARM\ARMCLANG\Bin&#39; Rebuild target &#39;Target 1&#39; assembling startup_stm32f10x_md.s... Start/core_cm3.c(445): error: non-ASM statement in naked function is not supported 445 | uint32_t result=0; | ^ Start/core_cm3.c(442): note: attribute is here 442 | uint32_t __get_PSP(void) __attribute__( ( naked ) ); | ^ Start/core_cm3.c(465): error: parameter references not allowed in naked functions 465 | "BX lr \n\t" : : "r" (topOfProcStack) ); | ^ Start/core_cm3.c(461): note: attribute is here 461 | void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) ); | ^ Start/core_cm3.c(479): error: non-ASM statement in naked function is not supported 479 | uint32_t result=0; | ^ Start/core_cm3.c(476): note: attribute is here 476 | uint32_t __get_MSP(void) __attribute__( ( naked ) ); | ^ Start/core_cm3.c(499): error: parameter references not allowed in naked functions 499 | "BX lr \n\t" : : "r" (topOfMainStack) ); | ^ Start/core_cm3.c(495): note: attribute is here 495 | void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); | ^ 4 errors generated. compiling core_cm3.c... compiling misc.c... compiling system_stm32f10x.c... compiling stm32f10x_adc.c... compiling stm32f10x_dac.c... compiling stm32f10x_exti.c... compiling stm32f10x_dbgmcu.c... compiling stm32f10x_dma.c... compiling stm32f10x_crc.c... compiling stm32f10x_cec.c... compiling stm32f10x_bkp.c... compiling stm32f10x_can.c... compiling stm32f10x_flash.c... compiling stm32f10x_pwr.c... compiling stm32f10x_fsmc.c... compiling stm32f10x_
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值