我刚刚开始使用grails 2.3,我在运行单元测试时遇到了问题。到目前为止我做的是我跑了
grails create-app new-app
grails create-service NewService
grails test-app
这会产生
| Running 1 unit test...
| Completed 0 unit test, 0 failed in 0m 2s
| Tests PASSED - view reports in C:\Git\aspera_web\target\test-reports
到目前为止,如果我编辑方法
那么好void "test something"() {
}
在NewServiceSpec类中
void "test something"() {
assert false
}
然后又跑了我再次
| Running 1 unit test...
| Completed 0 unit test, 0 failed in 0m 2s
| Tests PASSED - view reports in C:\Git\aspera_web\target\test-reports
然后我查看了spock文档并尝试再次编辑我的测试。
这一次void "test something"() {
expect: 1 == 2
}
产生
| Running 1 unit test...
| Running 1 unit test... 1 of 1
| Failure: test something(aspera_web.NewServiceSpec)
| Condition not satisfied:
false
at aspera_web.NewServiceSpec.test something(NewServiceSpec.groovy:19)
| Completed 1 unit test, 1 failed in 0m 2s
| Tests FAILED - view reports in C:\Git\aspera_web\target\test-reports
看起来很有希望然后下一步是测试我的NewService类中的方法,所以我再次将我的测试更改为
def service = new NewSevice()
void "test something"() {
expect: service.serviceMethod()
}
当我运行它时,我得到了
| Running 1 unit test...
| Running 1 unit test... 1 of 1
| Failure: test something(aspera_web.NewServiceSpec)
| java.lang.NullPointerException
at aspera_web.NewServiceSpec.test something(NewServiceSpec.groovy:21)
| Completed 1 unit test, 1 failed in 0m 2s
| Tests FAILED - view reports in C:\Git\aspera_web\target\test-reports
为了好的衡量,我还直接从Spock exmaples
添加了一个测试def stack = new Stack()
def "size"() {
expect: stack.size() == 0
}
这就像魅力......
最后我的问题是:
修改
显然这是Grails 2.3.0中的一个错误,请参阅下面的答案。
答案 0 :(得分:5)
解决方案是进入生成的服务类并删除@Transaction参数。然后由于某种原因,测试中的服务变量被实例化。
我已经提交了JIRA report。
解决方法强>
只需删除注释并添加行
即可static transactional = true
代替服务以获得相同的行为。
答案 1 :(得分:2)
正如您所知,Grails 2.3附带Spock进行测试而不是JUnit。我建议你看看at the basics。如果您需要类级属性,请查看“Fields”会话。
您还可以查看repository of examples。查看service example,您可以看到您的测试已经有一个名为“service”的变量,Grails在您使用@TestFor
注释时定义该变量。
@TestFor(NewService)
class NewServiceSpec {
def "some description of what the test should do"() {
expect:
service.serviceMethod() ...
}
}