6

我刚开始使用 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 示例中添加了一个测试

def stack = new Stack()
def "size"() {
    expect: stack.size() == 0
}

这就像一个魅力......

所以最后我的问题:

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

编辑

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

4

2 回答 2

5

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

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

解决方法

只需删除注释并添加行

static transactional = true

改为服务以获得相同的行为。

于 2013-09-25T14:16:17.033 回答
2

正如您所意识到的,Grails 2.3 带有用于测试的 Spock 而不是 JUnit。我建议你看看基础知识。如果您想要类级别的属性,请查看“字段”会话。

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

@TestFor(NewService)
class NewServiceSpec {

  def "some description of what the test should do"() {
    expect:
      service.serviceMethod() ...
  }
}
于 2013-09-25T11:53:11.167 回答