在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'
答案 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注释。如果这不适合您,则需要更多信息:
无论您的情况如何,您总是可以像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
}
}