如何为 grails 2.4 中的特征编写 spock 单元测试用例?
How to write a spock unit test case for traits in grails 2.4?
我正在使用 Traits 让我的控制器变干。我想使用 Spock 对 Trait class 进行单元测试。这里分别是我的示例特征和 Spock 测试用例:
trait SomeTrait {
public void checkSomething (Closure c ){
// Do some operation
c.call
}
}
@TestMixin(GrailsUnitTestMixin)
class SomeTraitSpec extends Specification {
void "test checkSomething "(){
setup:
MockedClass mockedObj = new MockedClass()
def x=0
def c = {
x=1
}
when:
mockedObj.checkSomething(c)
then:
assert x==1
}
}
class MockedClass implements PermissionTrait {
// some thing
}
因为 trait 是一个接口,我在我的测试用例中有一个 Mocked class 来实现 Trait,我创建了这个 Mocked class 的对象并调用我想要的 Trait 方法去测试。这是正确的方法吗,如果不是,请用适当的例子指出正确的方向。
Groovy 的类型强制可用于在运行时将特征的行为添加到 class。
class MyTraitSpec extends Specification
{
@Shared
MyTrait testInstance = new Object() as MyTrait
// ...
}
你应该知道这会创建一个代理实例,尽管文档 (http://docs.groovy-lang.org/docs/groovy-2.3.0/html/documentation/core-traits.html#_runtime_implementation_of_traits) 说代理保证实现特征和 any/all 接口,如果你这样做可能会导致问题重新检查对象的具体类型。
我正在使用 Traits 让我的控制器变干。我想使用 Spock 对 Trait class 进行单元测试。这里分别是我的示例特征和 Spock 测试用例:
trait SomeTrait {
public void checkSomething (Closure c ){
// Do some operation
c.call
}
}
@TestMixin(GrailsUnitTestMixin)
class SomeTraitSpec extends Specification {
void "test checkSomething "(){
setup:
MockedClass mockedObj = new MockedClass()
def x=0
def c = {
x=1
}
when:
mockedObj.checkSomething(c)
then:
assert x==1
}
}
class MockedClass implements PermissionTrait {
// some thing
}
因为 trait 是一个接口,我在我的测试用例中有一个 Mocked class 来实现 Trait,我创建了这个 Mocked class 的对象并调用我想要的 Trait 方法去测试。这是正确的方法吗,如果不是,请用适当的例子指出正确的方向。
Groovy 的类型强制可用于在运行时将特征的行为添加到 class。
class MyTraitSpec extends Specification
{
@Shared
MyTrait testInstance = new Object() as MyTrait
// ...
}
你应该知道这会创建一个代理实例,尽管文档 (http://docs.groovy-lang.org/docs/groovy-2.3.0/html/documentation/core-traits.html#_runtime_implementation_of_traits) 说代理保证实现特征和 any/all 接口,如果你这样做可能会导致问题重新检查对象的具体类型。