NullpointerException:无法获取null对象的属性

时间:2015-03-04 11:38:06

标签: spring grails intellij-idea nullpointerexception spock

使用IDEA并尝试启动以下代码:

package com.myCompany.routing.spring

import com.dropbox.core.DbxRequestConfig
import grails.util.Holders
import spock.lang.Specification

class DropboxSpringConfigSpec extends Specification {
    def grailsApplication=Holders.grailsApplication

    def "It instantiates and configures the dropboxRequestConfig component"() {
        given:
        def ctx = grailsApplication.mainContext
        //do stuff...
    }
}

我收到以下错误:

  

java.lang.NullPointerException:无法获取属性' mainContext'在null对象

     

在com.myCompany.routing.spring.DropboxSpringConfigSpec.It实例化和配置dropboxRequestConfig组件(DropboxSpringConfigSpec.groovy:20)

我最近拉了我的VCS,所以代码应该可以运行。

当以Grails测试运行测试时,我收到以下错误:

  

错误|   2015-03-04 13:32:00,989 [localhost-startStop-1] ERROR context.GrailsContextLoader - 初始化应用程序时出错:   Config.groovy中缺少配置:connection.uri。

2 个答案:

答案 0 :(得分:2)

好的,似乎Config.groovy中的一些配置被赋予了一些环境变量的值:

elasticSearch {
    connection {
        uri = env.ES_URL
        username = env.ES_USER
        password = env.ES_PASSWORD
    }
    indexPrefix = 'test-'
}

由于我从未创建过相应的环境变量,因此GrailsContextLoader无法找到相应的值而计算失败。

在我的IDE中初始化所需的环境变量并以Grails测试运行测试解决了这个问题。

答案 1 :(得分:1)

通过你的extends Specification看来你所拥有的是一个单元测试。 grailsApplication在单位规格上不可用,但可以模拟(即使用@TestFor(ClassUnderTest)注释为您嘲笑)。

如果要测试的是配置,我建议您编写integration规范。在integration阶段,您基本上没有Web界面的有线grails应用程序。在这种情况下,您需要做的就是

package com.myCompany.routing.spring

import com.dropbox.core.DbxRequestConfig
import grails.util.Holders
import grails.test.spock.IntegrationSpec

class DropboxSpringConfigSpec extends IntegrationSpec {
    def grailsApplication //This will be auto-wired 

    def "It instantiates and configures the dropboxRequestConfig component"() {
        given:
        def ctx = grailsApplication.mainContext
        //do stuff...
    }
}

以前在您的VCS中使用过的测试。我从未在Holders规范中使用过unit,所以我不能说它不起作用,但它可能只是误报。根据我对unit阶段的理解,您没有正在运行的grails应用程序,并且bean(包括配置)在您或测试框架嘲笑之前将无法使用(再次使用@TestFor@Mock