pinei
pinei

Reputation: 2303

NullPointerException for grails service properties in unit tests

With grails 2.5.1, I only created a service with a simple property initialized through a constructor (@PostConstruct also)

Any unit test that read this property through a service method get a NullPointerException

Here's how to reproduce:

grails> create-app acme
grails> create-service DataService

acme/DataService.groovy

@Transactional
class DataService {

    def data = null;

    @PostConstruct
    def setup() {
        if (data == null) {
            println("Initializing the service ...")
            data = "<DATA>"
        }
    }

    def serviceMethod() {
        setup()
    }

    def getDataLength() {
        println("Getting data length ...")
        return data.length(); // Line 26
    }
}

acme/DataServiceSpec.groovy

@TestFor(DataService)
class DataServiceSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test data"() {
        given:
            int datalen = service.getDataLength()
        expect:
            datalen > 0
    }
}

Running the test ....

grails> test-app -unit -echoOut

The output ...

|Running 2 unit tests...
|Running 2 unit tests... 1 of 2
--Output from test data--
Initializing the service ...
Getting data length ...
Failure:  |
test data(acme.DataServiceSpec)
 |
java.lang.NullPointerException: Cannot invoke method length() on null object
        at acme.DataService.getDataLength(DataService.groovy:26)
        at acme.DataServiceSpec.test data(DataServiceSpec.groovy:20)
|Completed 1 unit test, 1 failed in 0m 2s
.Tests FAILED

The log shows the property initialization step and the NullPointerException for the property.

The questions are:

Upvotes: 1

Views: 621

Answers (1)

swiatows
swiatows

Reputation: 98

Have you seen Grails unit test fails on @PostConstruct?

In unit test and with @TestFor annotation @PostConstruct is not called. You can create construct for test or call setup method.

Upvotes: 2

Related Questions