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

时间:2015-09-28 21:40:27

标签: grails grails-2.5

使用grails 2.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
    }
}

ACME / DataServiceSpec.groovy

@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。

问题是:

  • 为什么&#39;数据&#39;属性变为空?
  • 有一个服务生命周期,将该属性设置为null?
  • 正在运行的测试是否使用了与初始化实例不同的DataService实例?

1 个答案:

答案 0 :(得分:2)

你见过Grails unit test fails on @PostConstruct吗?

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