首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在grails2.3中测试服务或控制器方法

如何在grails2.3中测试服务或控制器方法
EN

Stack Overflow用户
提问于 2013-09-25 07:59:02
回答 2查看 7.7K关注 0票数 6

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

代码语言:javascript
复制
grails create-app new-app
grails create-service NewService
grails test-app

这会产生

代码语言:javascript
复制
| 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

目前为止还不错,但是如果我编辑这个方法

代码语言:javascript
复制
void "test something"() {
}

在NewServiceSpec类中

代码语言:javascript
复制
void "test something"() {
    assert false
}

再跑一次我又一次

代码语言:javascript
复制
| 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文档,并试图再次编辑我的测试。这一次

代码语言:javascript
复制
void "test something"() {
    expect: 1 == 2
}

代码语言:javascript
复制
| 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类中测试方法,所以我再次将测试更改为

代码语言:javascript
复制
def service = new NewSevice()
void "test something"() {
    expect: service.serviceMethod()
}

当我运行它时,我得到

代码语言:javascript
复制
| 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添加了一个测试。

代码语言:javascript
复制
def stack = new Stack()
def "size"() {
    expect: stack.size() == 0
}

就像魅力一样..。

最后,我的问题是:

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

编辑

显然,这是Grails2.3.0中的一个bug,请参阅下面的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-25 14:16:17

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

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

解决方案

只需删除注释并添加行

代码语言:javascript
复制
static transactional = true

而不是为了得到相同的行为。

票数 5
EN

Stack Overflow用户

发布于 2013-09-25 11:53:11

正如您意识到的,Grails2.3为测试而不是JUnit提供了Spock。我建议你看起来像最基本的。如果您想要类级属性,请查看“字段”会话。

还有一个您可以检查的示例存储库。查看服务示例,您可以看到您的测试已经有了一个名为"service“的变量,当您使用@TestFor注释时,这个变量是Grails定义的。

代码语言:javascript
复制
@TestFor(NewService)
class NewServiceSpec {

  def "some description of what the test should do"() {
    expect:
      service.serviceMethod() ...
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18999343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档