我正在使用Spock为groovy-2.0编写单元测试,并使用gradle运行。如果我按照测试通过写。
import spock.lang.Specification
class MyTest extends Specification {
def "test if myMethod returns true"() {
expect:
Result == true;
where:
Result = new DSLValidator().myMethod()
}
}
myMethod()是DSLValidator类中的一个简单方法,只返回true。
但是如果我编写一个setup()函数并在setup()中创建对象,我的测试就会失败:Gradel说:FAILED:java.lang.NullPointerException:无法在null对象上调用方法myMethod()
以下是setup(),
的样子import spock.lang.Specification
class MyTest extends Specification {
def obj
def setup(){
obj = new DSLValidator()
}
def "test if myMethod returns true"() {
expect:
Result == true;
where:
Result = obj.myMethod()
}
}
有人可以帮忙吗?
以下是解决问题的方法:
import spock.lang.Specification
class DSLValidatorTest extends Specification {
def validator
def setup() {
validator = new DSLValidator()
}
def "test if DSL is valid"() {
expect:
true == validator.isValid()
}
}
答案 0 :(得分:23)
在Spock中存储在实例字段中的对象不会在要素方法之间共享。相反,每个要素方法都有自己的对象。
如果您需要在要素方法之间共享对象,声明@Shared
字段。
class MyTest extends Specification {
@Shared obj = new DSLValidator()
def "test if myMethod returns true"() {
expect:
Result == true
where:
Result = obj.myMethod()
}
}
class MyTest extends Specification {
@Shared obj
def setupSpec() {
obj = new DSLValidator()
}
def "test if myMethod returns true"() {
expect:
Result == true
where:
Result = obj.myMethod()
}
}
有两种用于设置环境的夹具方法:
def setup() {} // run before every feature method
def setupSpec() {} // run before the first feature method
我不明白为什么使用setupSpec()
的第二个示例有效但setup()
失败,因为在documentation中另有说明:
注意:setupSpec()和cleanupSpec()方法可能无法引用 实例字段。