无法在null对象上获取属性'config' - Grails Service Spock Testing

时间:2013-03-14 13:25:27

标签: grails groovy spock

在Grails应用程序中使用UnitSpec为服务类运行spock测试用例时,将grailsApplication设为null。

Error - Cannot get property 'config' on null object

任何人都可以告诉我如何在spock测试服务类时配置grailsApplication

我搜索了很多,但没有解决我的问题。

这是代码。

  def accountServiceMock = Mock(AccountService)
    def accountClientService = new AccountClientService()
def setup(){

    accountClientService.accountWS = accountServiceMock
    accountClientService.basicAuthInterceptor = authenticatorServiceMock        
}

def "test account by status() " (){
    setup:
    def mockAccountStatus = "ACTIVE"
    mockDomain(Account, [accountInstance])
    accountClientService.grailsApplication = grailsApplication

    when:
    accountClientService.getAccountByStatus(mockAccountStatus)  //calling web service by fetching url from default.properties file which is context

    then:
    Account.count() != 0

    where:
    accountInstance = new Account(10L, "ACTIVE","1234", "firstName", "LastName")
}

在AccountService类中,getAccountByStatus()方法使用url = grailsApplication.config.ACCOUNTWEBSERVICEURL调用webservice,这是default.properties文件     但是当我运行spock测试用例时,它会抛出错误,如

无法在null对象上获取属性'config'

2 个答案:

答案 0 :(得分:3)

你走了:

import spock.lang.Specification
import grails.test.mixin.*

@TestFor(SomeService)
class SomeServiceIntegrationSpecSpec extends Specification {

    def "give me the config value"() {
        given: config.value = '123'
        expect: service.valueFromConfig == '123'
    }
}

...仅供参考,SomeService类:

class SomeService {

    def grailsApplication // autowired

    def getValueFromConfig() {
        grailsApplication.config.value
    }
}

上面的示例很简单,但足以说明应该如何完成。 grailsApplication的自动装配工作得益于@TestFor注释。如果这不适合您,则需要更多信息:

  • Grails版
  • Spock版本(grails插件版本可以)
  • 从哪里投掷NPE?经过测试的服务本身或模拟
  • 是grails单位还是整合测试
  • 完整的测试源将是非常的

无论您的情况如何,您总是可以像answered here by j4y一样模拟配置(当前时间的最后答案)

如果您正在进行单元测试,请记住Config.groovy不会被玷污。值得一提的另一件事是,如果NPE是从Mock()或'new'关键字创建的对象抛出的,那么就不会因为没有自动装配而感到惊讶。

答案 1 :(得分:1)

我有类似的问题。实际上有一个引用grailsApplication的域对象。

通过将grailsApplication从test分配给域来修复:

@TestMixin(GrailsUnitTestMixin)
@TestFor(MyService)
@Mock([MyDomain])
class MyServiceSpec extends Specification {

    myTest() {

        grailsApplication.config.myValue = "XXX"

        def myDomain = MyDomain()

        myDomain.grailsApplication = grailsApplication

    }
}