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

浙公网安备 33010602011771号