365bet地区365bet地区测试支持

365bet地区支持为365bet地区工件编写简洁的表达测试

2.1.1

介绍

365bet地区365bet地区测试支持库为使用简单易用的特征和支持类的365bet地区工件编写简洁的表达测试提供了支持。使用Traits使编译时将功能编织到测试类中,使开发人员可以显式查看和浏览代码。 365bet地区测试支持库使测试更加易于使用IDE,因此开发人员可以利用自动完成功能并单击导航

安装

要安装测试支持库,请将以下依赖项添加到依存关系你的块建立gradle365bet地区在365bet地区应用程序或插件中

testCompile组织的grails的grails gorm测试支持testCompile组织的grails的grails web测试支持
依赖关系是可选的,如果您不是单元测试域活动,则可能不需要GORM测试支持库

从Mixin框架升级

该库的设计与旧的mixin方法兼容。您可能会遇到一些细微的差异,但是任何必需的更改都应尽量少

FreshRuntime已删除

星期五由于新框架的设计,删除了注释。注释允许在方法级别或类级别对任何元类更改进行沙盒处理Spock提供了类似的注释来执行相同的操作ConfineMetaClassChanges.

此外,注释导致应用程序上下文被刷新,因为应用程序上下文在测试类之间自动刷新,因此不再需要注释

整合测试

积分注释已复制到此库,因此不再需要依赖旧框架。grails test mixin集成集成grails测试mixin集成集成集成测试的所有工作应与以前相同

转换测试示例

这是一个示例测试,看起来像您项目中的东西

测试AuthorController嘲笑作者 AuthorControllerTests {

    测试
    虚空testIndex控制器索引断言回应文字'你好'
    }
}

要将测试转换为新框架,我们必须对其进行更新以使用Spock,并将注释用法更改为特征用法

进口 spock lang规格
进口 免费测试gorm DomainUnitTest
进口 365bet地区测试Web控制器ControllerUnitTest

 AuthorControllerTests 延伸规格实施ControllerUnitTestDomainUnitTest {

    虚空testIndex什么时候控制器索引然后回应文字'你好'
    }
}

365bet地区显然,您可能需要转换许多用例,因此无法在本文档中将它们全部涵盖。作为此新框架测试的一部分,所有旧框架的用法都已在365bet地区核心中替换。您可以查看那些通过观察改变这个提交查看您将需要的绝大多数示例

单元测试

365bet地区通过实现365bet地区测试支持特征,单元测试继承了使编写测试简洁明了的功能。

以下功能可用于所有测试

修改应用程序上下文

对上下文的任何修改将特定于该测试类。为每个测试类创建一个新的上下文,就像在运行的应用程序中一样,对被测工件进行依赖注入,就像它们在运行的应用程序中一样。单元测试环境不会启动整个Spring应用程序上下文与通常在运行中的应用程序中配置的所有Bean单元测试可以通过多种不同方式注册执行测试所需的任何Bean

doWithSpring

要在上下文中提供或替换bean,您可以覆盖doWithSpring测试中的方法

关闭doWithSpring someService SomeService
此闭包中可用的语法与可能用于grails app conf春季资源groovy用于定义bean定义

资源槽

如果您希望将应用程序的资源文件加载到上下文中,请覆盖loadExternalBeans方法

布尔值loadExternalBeans真正
}

插件的Spring配置

如果您想要doWithSpring为测试调用的所有已加载插件的配置将覆盖getIncludePlugins方法并返回代表插件名称的字符串列表

<getIncludePlugins"springSecurityCore"设置
如果覆盖此方法,则将不包括默认插件。默认插件为核心eventBus如果您要在默认设置之外添加插件,请将默认设置添加到列表中

其他Spring配置

在测试期间的任何时间,您也可以直接致电defineBeans方法defineBeans方法可以采用闭包或插件实例

虚空 "测试Bean是否可用于上下文"() {
    给定defineBeans someInteger整数, 2)
    }

    期望applicationContext getBean'someInteger') == 2
}

如果您将插件实例传递给方法,doWithSpring将被执行

虚空testSomething给定defineBeansMyCustomPlugin期望applicationContext containsBean'someBeanAddedByDoWithSpring')
}

自动装配测试

可以为自动装配设置测试类本身,只需实现自动接线测试性状和豆类将被注入测试班

例如

进口 365bet地区测试Spring AutowiredTest
进口 spock lang规格

 自动连线测试规格 延伸规格实施自动连线测试关闭doWithSpring helperService HelperService HelperService helperService虚空设定断言helperService空值
    }

    虚空 '一些测试方法'() {
        期望helperService空值
    }

    虚空 '其他测试方法'() {
        期望helperService空值
    }
}

操作配置

要更改测试类上下文的配置,请覆盖doWithConfig方法

关闭doWithConfig config config foo bar"X"
}}
测试仅需要实施365bet地区365bet地区UnitTest特性获得上述功能所有其他测试特性都得到扩展365bet地区UnitTest因此直接实施它并不常见

单元测试控制器

使用365bet地区测试Web控制器ControllerUnitTest单元测试控制器的特征

src测试groovy演示DemoControllerSpec groovy
演示进口 365bet地区测试Web控制器ControllerUnitTest
进口 spock lang规格

 DemoControllerSpec 延伸规格实施ControllerUnitTest {

    // ...

}

要测试最简单的Hello World样式示例,您可以执行以下操作

grails应用程序控制器演示DemoController groovy
演示 演示控制器 {

    定义 你好渲染'你好,世界'
    }

}
src测试groovy演示DemoControllerSpec groovy
演示进口 365bet地区测试Web控制器ControllerUnitTest
进口 spock lang规格

 DemoControllerSpec 延伸规格实施ControllerUnitTest {

    // ...

    虚空 "测试呈现文本的动作"() {
        什么时候控制器你好(1)

        然后状态200                    (2)回应文字'你好,世界' (3)
    }

}
1 控制者属性将是演示控制器
2 状态属性将包含响应状态的值
3 响应属性将是对HTTP响应对象的引用

看到ControllerUnitTest有关所有可用属性的信息的文档

为了使测试控制器能够轻松呈现JSON视图,我们进行了一项更改,要求将测试代码中使用的控制器变量作为委托给真实控制器实例的代理,如果由于某种原因导致测试出现问题,可以通过重写方法来禁用代理的创建
 DemoControllerSpec 实施ControllerUnitTest {

    布尔值disableControllerProxy真正
    }
}

这样一来,默认情况下就不会呈现JSON视图。要像以前那样通知JSON视图以使其自动呈现,webRequest反对您要执行的操作

 DemoControllerSpec 实施ControllerUnitTest {

    虚空 "测试指标"() {
        什么时候webRequest actionName'指数'控制器索引然后:
        ...
    }

    布尔值disableControllerProxy真正
    }
}

单元测试域类

使用免费测试gorm DomainUnitTest单元测试单域类的特征

365bet地区应用程序域演示Person groovy
演示  {
    名字
src测试groovy演示PersonSpec groovy
演示进口 免费测试gorm DomainUnitTest
进口 spock lang共享
进口 spock lang规格
进口 只是逐步

逐步地
 PersonSpec 延伸规格实施DomainUnitTest {

    共享 整型ID虚空 "测试基本持久性模拟"() {
        设定:
        名字: '罗伯特', : '弗里普'保存名字: '阿德里安', : '贝露'保存期望人数2
    }

    虚空 "测试域实例"() {
        设定ID系统identityHashCode域期望空值域hashCode ID什么时候域名字'罗伯特'

        然后域名字'罗伯特'
    }

    虚空 "测试我们得到一个新域名"() {
        期望空值域名字空值
        系统identityHashCode域ID

或者grails测试gorm DataTest使用时可以使用数据测试明确呼叫模拟域要么模拟域方法可以用于指定在该测试中应该模拟哪个领域类es在一次模拟多个Domain类以测试持久性时非常有用

src测试groovy演示DataTestTraitSpec groovy
演示进口 grails测试gorm DataTest
进口 spock lang规格

 DataTestTraitSpec 延伸规格实施数据测试虚空setupSpec模拟域人对于多个域,请调用mockDomains
        模拟域名人地址公司
    }

    虚空 "测试基本持久性模拟"() {
        设定:
        名字: '罗伯特', : '弗里普'保存名字: '阿德里安', : '贝露'保存期望人数2
    }
}

表达该测试应模拟哪些领域类的另一种方法是提供一个类getDomainClassesToMock测试方法

src测试groovy演示GetDomainClassesToMockMethodSpec groovy
演示进口 grails测试gorm DataTest
进口 spock lang规格

 GetDomainClassesToMockMethodSpec 延伸规格实施数据测试[]getDomainClassesToMock人虚空 "测试基本持久性模拟"() {
        设定:
        名字: '罗伯特', : '弗里普'保存名字: '阿德里安', : '贝露'保存期望人数2
    }
}

在测试领域类以测试其他工件类型(例如)时ControllerUnitTest测试,例如测试必须实现数据测试特质以模拟相关领域类

src测试groovy演示PersonControllerSpec groovy
演示进口 grails测试gorm DataTest
进口 365bet地区测试Web控制器ControllerUnitTest
进口 spock lang规格

 PersonControllerSpec 延伸规格实施ControllerUnitTest数据测试虚空setupSpec模拟域人虚空 "调用GORM方法的测试操作"() {
        设定:
        名字: '罗伯特', : '弗里普'保存名字: '阿德里安', : '贝露'保存什么时候:
        定义模型控制器索引然后模特儿人数2模型keySet包含'')
    }
}

单元测试服务

使用免费测试服务ServiceUnitTest单元测试服务的特征

grails应用程序服务演示HelperService groovy
演示 助手服务 {

    定义 getMagicNumber() {
        42
    }
}
src测试groovy演示HelperServiceSpec groovy
演示进口 免费测试服务ServiceUnitTest
进口 spock lang规格

 HelperServiceSpec 延伸规格实施ServiceUnitTest {

    虚空 "测试检索属性"() {
        期望服务magicNumber42
    }
}

添加ServiceUnitTest测试的特质会导致新的服务为要测试的Service类自动创建的属性

单元测试标签库

基础

标记库和GSP页面可以使用免费测试web taglib TagLibUnitTest特征

grails应用程序taglib演示SampleTagLib groovy
演示 SampleTagLib {

    静态的defaultEncodeAs标签库:'html']

    静态的命名空间'演示'

    定义helloWorld attrs out'你好,世界'
    }
}
src测试groovy演示SampleTagLibSpec groovy
演示进口 免费测试web taglib TagLibUnitTest
进口 spock lang规格

 SampleTagLibSpec 延伸规格实施TagLibUnitTest {

    虚空 "测试简单标记作为方法"() {
        期望tagLib helloWorld'你好,世界'
    }
}

添加TagLibUnitTest测试的特质会导致新的tagLib为要测试的TagLib类自动创建的字段tagLib属性可用于测试作为功能调用的调用标签功能调用的返回值可以是组织grails缓冲区StreamCharBuffer标签关闭返回的实例或对象returnObjectForTags使用功能

要测试接受参数的标签,请将参数值指定为方法调用的命名参数

grails应用程序taglib演示SampleTagLib groovy
演示 SampleTagLib {

    静态的defaultEncodeAs标签库:'html']

    静态的命名空间'演示'

    定义说你好attrs out"你好${属性名称}!"
    }
}
src测试groovy演示SampleTagLibSpec groovy
演示进口 免费测试web taglib TagLibUnitTest
进口 spock lang规格

 SampleTagLibSpec 延伸规格实施TagLibUnitTest {

    虚空 "将测试标签作为带有参数的方法"() {
        期望tagLib说你好那么: '罗伯特') == '你好罗伯特'
    }
}

另外,也可以使用applyTemplate接受一个的方法参数,将其作为GSP中的源代码进行评估

src测试groovy演示SampleTagLibSpec groovy
演示进口 免费测试web taglib TagLibUnitTest
进口 spock lang规格

 SampleTagLibSpec 延伸规格实施TagLibUnitTest {

    虚空 "使用applyTemplate测试标签"() {
        期望applyTemplate'') == '你好,世界'applyTemplate'') == '你好阿德里安'
    }
}

applyTemplate方法接受可选的第二个参数,该参数是地图包含可以在GSP代码段中访问的模型变量,该变量过去已作为的第一个参数applyTemplate如下所示

grails应用程序taglib演示SampleTagLib groovy
演示 SampleTagLib {

    静态的defaultEncodeAs标签库:'html']

    静态的命名空间'演示'

    定义renderSomeNumber属性整型数字属性'', -1"数字是${}"
    }
}
src测试groovy演示SampleTagLibSpec groovy
演示进口 免费测试web taglib TagLibUnitTest
进口 spock lang规格

 SampleTagLibSpec 延伸规格实施TagLibUnitTest {

    虚空 "测试访问模型的标签"() {
        期望: '在输出中使用value属性'applyTemplate'',
                      [X: 23, : 19]) == '数字是'
    }
}
将字符串作为第一个参数传递给applyTemplate包括一个Groovy String表达式x和在评估GSP代码段时而不是在评估测试中的代码时需要评估''作品""不会

模拟标签库

为了测试可从另一个标签库调用标签的标签库,需要通过调用mockTagLib方法

grails应用程序taglib演示FirstTagLib groovy
演示 FirstTagLib {
    静态的defaultEncodeAs标签库:'html']

    静态的命名空间''

    定义说你好attrs out'之前'

        这是从另一个标签库调用标签出来两个说你好''
    }
}
grails应用程序taglib演示SecondTagLib groovy
演示 SecondTagLib {
    静态的defaultEncodeAs标签库:'html']

    静态的命名空间''

    定义说你好attrs out'你好从SecondTagLib'
    }
}
src测试groovy演示FirstTagLibSpec groovy
演示进口 免费测试web taglib TagLibUnitTest
进口 spock lang规格

 FirstTagLibSpec 延伸规格实施TagLibUnitTest {

    虚空setupSpec mockTagLib SecondTagLib虚空 "测试调用一个标签,该标签调用另一个taglib中的一个标签"() {
        期望tagLib说你好'在SecondTagLib之后打招呼之前'
    }
}

单元测试拦截器

使用拦截器单元测试单元测试拦截器的特征

拦截器单元测试特征提供了简化测试拦截器的方法

 测试拦截器TestInterceptor匹配控制者: "测试")
    }

    布尔值在请求setAttribute之前'', 'Foo是酒吧')
        真正
    }
}

withRequest

您可以使用withRequest结合的方法拦截器验证您的拦截器是否符合请求

虚空 "测试测试拦截器匹配"() {
    什么时候withRequest控制者: "测试")

    然后拦截器什么时候withRequest控制者: "")

    然后拦截器

withInterceptors

您可以使用withInterceptors在拦截器执行的上下文中执行代码的方法通常完成此操作以调用依赖于拦截器行为的控制器动作

鉴于此控制器动作

365bet地区应用程序控制器演示TestController groovy
定义 renderAttribute渲染请求getAttribute'')
}

这是操作的测试方式withInterceptors:

虚空 "使用拦截器测试控制器执行"() {
    给定:
    定义控制器TestController模拟控制器TestController什么时候withInterceptors控制者: "测试"控制器renderAttribute然后回应文字"Foo是酒吧"
}

添加拦截器单元测试测试的特质会导致新的为被测Interceptor类自动创建的属性

单元测试网址映射

使用UrlMappingsUnitTest特质到单元测试url映射测试url映射还要求模拟控制器以匹配映射到

不能模拟控制器setupSpec由于要为每个测试创建和重置请求的性质,因此直到设定因此,在此之前无法模拟控制器

所有检查url映射的方法都以表格形式出现断言校验断言版本会引发类似于以下内容的AssertionFailed异常断言Groovy中的关键字校验方法将简单地返回true或false,这取决于是否找到了URL映射并且对期望是否有效

这些示例假定正在使用以下映射

演示 网址映射 {

    静态的映射""(控制者: "测试", 行动: "fooGet", 方法: "得到")
        ""(控制者: "测试", 行动: "fooPost", 方法: "开机自检")
        "酒吧"(控制者: "测试", 行动: "酒吧")

        "/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}

入门

要开始实施UrlMappingsUnitTest在您要测试的测试类和模拟控制器中

进口 免费测试Web UrlMappingsUnitTest
进口 spock lang规格

 网址映射规范 延伸规格实施UrlMappingsUnitTest {

    虚空设置模拟控制器TestController

也可以将模拟控制器如果需要在不同的测试方法中测试不同的控制器,请使用功能方法给定模块中的方法

前向网址映射测试

测试是否为给定的控制器类转发URL映射

虚空 "测试正向映射"() {
    期望verifyForwardUrlMapping"测试renderText", 控制者: '测试', 行动: 'renderText'verifyForwardUrlMapping"测试renderView", 控制者: '测试', 行动: '的RenderView'verifyForwardUrlMapping"测试renderState", 控制者: '测试', 行动: '绘制状态'ID'123'verifyForwardUrlMapping"/", 视图: '指数'verifyForwardUrlMapping500, 视图: '错误'verifyForwardUrlMapping404, 视图: '未找到')

    什么时候: "使用断言语法"assertForwardUrlMapping"测试renderText", 控制者: '测试', 行动: 'renderText'assertForwardUrlMapping"测试renderView", 控制者: '测试', 行动: '的RenderView'assertForwardUrlMapping"测试renderState", 控制者: '测试', 行动: '绘制状态'ID123assertForwardUrlMapping"/", 视图: '指数'assertForwardUrlMapping500, 视图: '错误'assertForwardUrlMapping404, 视图: '未找到')

    然后noExceptionThrown

反向网址映射测试

测试将链接反向映射到给定控制器和操作时是否生成给定URL

虚空 "测试反向映射"() {
    期望verifyReverseUrlMapping"测试renderText", 控制者: '测试', 行动: 'renderText'verifyReverseUrlMapping"测试renderView", 控制者: '测试', 行动: '的RenderView'verifyReverseUrlMapping"测试renderState foo bar", 控制者: '测试', 行动: '绘制状态'ID123'酒吧'verifyReverseUrlMapping"/", 视图: '指数')

    什么时候: "使用断言语法"assertReverseUrlMapping"测试renderText", 控制者: '测试', 行动: 'renderText'assertReverseUrlMapping"测试renderView", 控制者: '测试', 行动: '的RenderView'assertReverseUrlMapping"测试renderState foo bar", 控制者: '测试', 行动: '绘制状态'ID123'酒吧'assertReverseUrlMapping"/", 视图: '指数')

    然后noExceptionThrown
HTTP状态代码的网址映射无法撤消,因为链接到状态代码没有意义

组合式

测试URL映射对于给定URL是否有效这结合了正向和反向方法

虚空 "测试正向和反向映射"() {
    期望验证网址映射"测试renderText", 控制者: '测试', 行动: 'renderText'验证网址映射"测试renderView", 控制者: '测试', 行动: '的RenderView'验证网址映射"测试renderState", 控制者: '测试', 行动: '绘制状态'ID123验证网址映射"/", 视图: '指数')

    什么时候: "使用断言语法"assertUrlMapping"测试renderText", 控制者: '测试', 行动: 'renderText'assertUrlMapping"测试renderView", 控制者: '测试', 行动: '的RenderView'assertUrlMapping"测试renderState", 控制者: '测试', 行动: '绘制状态'ID123assertUrlMapping"/", 视图: '指数')

    然后noExceptionThrown
打电话时验证网址映射那么仅当提供了控制器并且第一个参数不是HTTP状态代码时,才会检查反向映射

HTTP方法

在反向URL映射上测试HTTP方法时,有必要在测试中指定HTTP方法

虚空 "使用http方法测试反向映射"() {
    期望verifyReverseUrlMapping'', 控制者: '测试', 行动: 'fooGet'verifyReverseUrlMapping'', 控制者: '测试', 行动: 'fooGet', 方法: '得到'verifyReverseUrlMapping'', 控制者: '测试', 行动: 'fooPost', 方法: '开机自检'verifyReverseUrlMapping'酒吧', 控制者: '测试', 行动: '酒吧')

    什么时候: "使用断言语法"assertReverseUrlMapping'', 控制者: '测试', 行动: 'fooGet', 方法: '得到'assertReverseUrlMapping'', 控制者: '测试', 行动: 'fooPost', 方法: '开机自检'assertReverseUrlMapping'酒吧', 控制者: '测试', 行动: '酒吧')

    然后noExceptionThrown

在前向URL映射上测试HTTP方法时,有必要在请求中指定HTTP方法

虚空 "使用http方法测试正向映射"() {
    什么时候: "http方法是GET foo应该映射到TestController fooGet"请求方法"得到"assertForwardUrlMapping'', 控制者: '测试', 行动: 'fooGet')

    然后noExceptionThrown什么时候: "http方法为POST foo应该映射到TestController fooPost"请求方法"开机自检"assertForwardUrlMapping'', 控制者: '测试', 行动: 'fooPost')

    然后noExceptionThrown

在同时使用正向和反向URL映射测试HTTP方法时,有必要在请求和测试中同时指定HTTP方法

虚空 "使用http方法测试正向和反向映射"() {
    什么时候: "http方法是GET foo应该映射到TestController fooGet"请求方法"得到"assertUrlMapping'', 控制者: '测试', 行动: 'fooGet', 方法: '得到')

    然后noExceptionThrown什么时候: "http方法为POST foo应该映射到TestController fooPost"请求方法"开机自检"assertUrlMapping'', 控制者: '测试', 行动: 'fooPost', 方法: '开机自检')

    然后noExceptionThrown

其他有用的方法

控制器检查

使用verifyController检查给定控制器名称是否存在的方法

虚空 "测试控制器"() {
    期望verifyController"测试")

    什么时候: "使用断言语法"assertController"测试")

    然后noExceptionThrown

动作检查

使用verifyAction验证控制器是否存在动作的方法

虚空 "测试动作"() {
    期望verifyAction"测试", "renderText")

    什么时候: "使用断言语法"assertAction"测试", "renderText")

    然后noExceptionThrown

查看支票

用户verifyView检查控制器是否存在GSP的方法

虚空 "测试视图"() {
    期望verifyView"测试", "")

    什么时候: "使用断言语法"assertView"测试", "")

    然后noExceptionThrown

注解

运行一次

365bet地区测试Spock RunOnce注释可以应用于您希望仅执行一次的任何Spock测试治具方法,这在与治具注释一起使用时非常有用之前如下所示

src测试groovy grails测试spock RunOnceSpec groovy
365bet地区测试Spock进口 org junit之前
进口 spock lang共享
进口 spock lang规格
进口 只是逐步

逐步地
 RunOnceSpec 延伸规格共享
    整型setupSpecCounter0

    共享
    整型setupCounter0

    共享
    整型OnceBeforeCounter0

    共享
    整型anotherOnceBeforeCounter0

    共享
    整型beforeCounter0

    虚空setupSpec setupSpecCounter虚空设置setupCounter之前
    虚空someBeforeMethod beforeCounter之前
    运行一次
    虚空someOnceBeforeMethod OnceBeforeCounter之前
    运行一次
    虚空someOtherOnceBeforeMethod anotherOnceBeforeCounter虚空 '第一次测试'() {
        期望setupSpecCounter1setupCounter1beforeCounter1OnceBeforeCounter1anotherOnceBeforeCounter1
    }

    虚空 '第二次测试'() {
        期望setupSpecCounter1setupCounter2beforeCounter2OnceBeforeCounter1anotherOnceBeforeCounter1
    }

    虚空 '第三次测试'() {
        期望setupSpecCounter1setupCounter3beforeCounter3OnceBeforeCounter1anotherOnceBeforeCounter1
    }
}

同时应用运行一次之前方法的注释将产生类似于Spock的行为setupSpec方法,但重要的区别是setupSpec在测试实例受到依赖项注入之前运行,而之前方法在测试实例受到依赖项注入之后运行,这意味着setupSpec方法将无法访问注入的变量,但标记为之前将有权访问注入的变量。如果一个测试具有某个一次性设置逻辑,则在依赖注入发生后需要执行该逻辑。运行一次注释可以帮助实现这一目标

之前

365bet地区测试Spock一次批注是一种实现相同行为的简捷方式,可以通过应用运行一次之前夹具方法的注释

src测试groovy grails测试spock OnceBeforeSpec groovy
365bet地区测试Spock进口 org junit之前
进口 spock lang共享
进口 spock lang规格
进口 只是逐步

逐步地
 一次规范 延伸规格共享
    整型setupSpecCounter0

    共享
    整型setupCounter0

    共享
    整型OnceBeforeCounter0

    共享
    整型anotherOnceBeforeCounter0

    共享
    整型beforeCounter0

    虚空setupSpec setupSpecCounter虚空设置setupCounter之前
    虚空someBeforeMethod beforeCounter之前
    虚空someOnceBeforeMethod OnceBeforeCounter之前
    虚空someOtherOnceBeforeMethod anotherOnceBeforeCounter虚空 '第一次测试'() {
        期望setupSpecCounter1setupCounter1beforeCounter1OnceBeforeCounter1anotherOnceBeforeCounter1
    }

    虚空 '第二次测试'() {
        期望setupSpecCounter1setupCounter2beforeCounter2OnceBeforeCounter1anotherOnceBeforeCounter1
    }

    虚空 '第三次测试'() {
        期望setupSpecCounter1setupCounter3beforeCounter3OnceBeforeCounter1anotherOnceBeforeCounter1
    }
}

这在集成测试的上下文中很有用,该集成测试希望在安装过程中参考依赖项注入的值,如下所示

src集成测试groovy演示DependencyInjectionSpec groovy
演示进口 grails测试mixin集成集成
进口 365bet地区测试Spock一次
进口 spock lang规格

积分
 DependencyInjectionSpec 延伸规格HelperService helperService之前
    虚空在里面断言helperService空值
    }

    虚空 '一些测试方法'() {
        期望helperService空值
    }
}

有用的属性

测试框架提供并初始化了许多可直接访问的单元测试属性。javadocs对于各种特征描述那些属性一些感兴趣的特定属性

所有单元测试中可用的属性

所有Web单元测试中可用的属性控制器拦截器Taglib UrlMappings

控制器单元测试属性

拦截器单元测试属性

服务单元测试属性

标签库单元测试属性

域类单元测试属性

提供文件

请点击这里查看API文档