单元测试中grails服务属性的NullPointerException
在Grails2.5.1中,我只创建了一个通过构造函数初始化的简单属性的服务(@PostConstruct) 任何通过服务方法读取此属性的单元测试都会获得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
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。您可以为测试或调用设置方法创建构造