如何在grails中测试服务或控制器方法2.3

Spa*_*ade 6 grails grails-controller grails-2.0

我刚刚开始使用grails 2.3,我在运行单元测试时遇到了问题.到目前为止我所做的是我跑了

grails create-app new-app
grails create-service NewService
grails test-app
Run Code Online (Sandbox Code Playgroud)

这产生了

| 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
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好,但如果我编辑方法

void "test something"() {
}
Run Code Online (Sandbox Code Playgroud)

在NewServiceSpec类中

void "test something"() {
    assert false
}
Run Code Online (Sandbox Code Playgroud)

又跑了我又来了

| 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
Run Code Online (Sandbox Code Playgroud)

然后我查看了spock文档并尝试再次编辑我的测试.这一次来

void "test something"() {
    expect: 1 == 2
}
Run Code Online (Sandbox Code Playgroud)

哪个产生

| 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
Run Code Online (Sandbox Code Playgroud)

看起来很有希望然后下一步是测试我的NewService类中的方法,所以我再次将测试更改为

def service = new NewSevice()
void "test something"() {
    expect: service.serviceMethod()
}
Run Code Online (Sandbox Code Playgroud)

当我跑的时候,我得到了

| 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
Run Code Online (Sandbox Code Playgroud)

为了好的衡量,我还直接从Spock exmaples中添加了一个测试

def stack = new Stack()
def "size"() {
    expect: stack.size() == 0
}
Run Code Online (Sandbox Code Playgroud)

哪个像魅力一样......

最后我的问题是:

  • 如何测试我自己的服务/控制器方法(如果我用create-controller替换create-service,我会得到完全相同的结果)

编辑

显然这是Grails 2.3.0中的一个错误,请参阅下面的答案.

Spa*_*ade 5

解决方案是进入生成的服务类并删除@Transaction参数.然后由于某种原因,测试中的服务变量被实例化.

我已经提交了一份关于它的JIRA报告.

解决方法

只需删除注释并添加该行即可

static transactional = true
Run Code Online (Sandbox Code Playgroud)

而不是为了获得相同的行为.