单元测试中grails服务属性的NullPointerException

单元测试中grails服务属性的NullPointerException,grails,grails-2.5,Grails,Grails 2.5,在Grails2.5.1中,我只创建了一个通过构造函数初始化的简单属性的服务(@PostConstruct) 任何通过服务方法读取此属性的单元测试都会获得NullPointerException 以下是如何复制: grails> create-app acme grails> create-service DataService acme/DataService.groovy @Transactional class DataService { def data = nu

在Grails2.5.1中,我只创建了一个通过构造函数初始化的简单属性的服务(@PostConstruct)

任何通过服务方法读取此属性的单元测试都会获得NullPointerException

以下是如何复制:

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
    }
}
@TestFor(DataService)
class DataServiceSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test data"() {
        given:
            int datalen = service.getDataLength()
        expect:
            datalen > 0
    }
}
正在运行测试

grails> test-app -unit -echoOut
输出

|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
日志显示属性初始化步骤和属性的NullPointerException

问题是:

  • 为什么“数据”属性变为空
  • 服务生命周期将属性设置为null
  • 正在运行的测试是否使用与初始化实例不同的DataService实例
    • 你看到了吗

      在单元测试和@TestFor注释中,不调用@PostConstruct。您可以为测试或调用设置方法创建构造