I'm just starting out with grails 2.3 and I have problems getting the unit tests to run. What I've done so far is I've run
grails create-app new-app
grails create-service NewService
grails test-app
This produces
| 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
So far so good but if I edit the method
void "test something"() {
}
in the NewServiceSpec class to
void "test something"() {
assert false
}
and run again I again get
| 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
I then looked into the spock documentation and tried to edit my test again. This time to
void "test something"() {
expect: 1 == 2
}
which produces
| 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
which looks promising so then the next step is to test methods in my NewService class so I again change my test to
def service = new NewSevice()
void "test something"() {
expect: service.serviceMethod()
}
and when I run it I get
| 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
just for good measure I also added a test directly from the Spock exmaples
def stack = new Stack()
def "size"() {
expect: stack.size() == 0
}
Which works like a charm...
So at last my question:
EDIT
Apparently this is a bug in Grails 2.3.0 see my answer below.
The solution was to go into the generated service class and remove the @Transaction parameter. Then for some reason the service variable in the test gets instantiated.
I've filed a JIRA report about it.
Workaround
Just remove the annotation and add the line
static transactional = true
to the service instead to get the same behaviour.