3

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

Error - Cannot get property 'config' on null object

谁能告诉我如何grailsApplication在 spock 测试服务类时进行配置。

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

这是代码。

  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 测试用例时,它会抛出类似的错误

无法在空对象上获取属性“配置”

4

2 回答 2

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
    }
}

上面的例子很简单,尽管足以说明应该如何做。由于@TestFor 注释,grailsApplication 的自动装配工作。如果这不适合您的情况,则需要更多信息:

  • Grails 版本
  • Spock 版本(grails 插件版本可以)
  • NPE从哪里抛出?测试服务本身或模拟
  • 是 Grails 单元还是集成测试
  • 完整的测试源将是 hepful

无论您的具体情况如何,您都可以像j4y 在这里回答的那样模拟配置(当前时间的最后一个答案)

如果您进行单元测试,请记住 Config.groovy 不会被吞食。另一件值得一提的事情是,如果 NPE 是从 Mock() 或 'new' 关键字创建的对象中抛出的,那么这里没有自动装配也就不足为奇了。

于 2013-03-18T15:08:49.347 回答
1

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

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

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

    myTest() {

        grailsApplication.config.myValue = "XXX"

        def myDomain = MyDomain()

        myDomain.grailsApplication = grailsApplication

    }
}
于 2014-06-16T10:28:35.713 回答