2015-12-15 35 views
0

我有一个拦截器在模型对象上设置一个属性。在单元测试中,模型为空。Grails拦截器模型在单元测试中为null

拦截

import groovy.transform.CompileStatic 
import groovy.util.logging.Commons 

@CompileStatic 
@Commons 
class FooInterceptor { 

    FooInterceptor() { 
     matchAll() 
    } 

    boolean after() { 
     model.foo = 'bar' 
     true 
    } 
} 

规格

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

@TestFor(FooInterceptor) 
class FooInterceptorSpec extends Specification { 
    void "Test Foo interceptor loads var to model"() { 
     when: "A request matches the interceptor" 
      withRequest(controller: 'foo', action: 'index') 
      interceptor.after() 

     then: "The interceptor loads the model" 
      interceptor.doesMatch() 
      interceptor.model.foo == 'bar' 
    } 
} 

堆栈跟踪

Cannot set property 'foo' on null object 
java.lang.NullPointerException: Cannot set property 'foo' on null object 
    at bsb.core.web.FooInterceptor.after(FooInterceptor.groovy:13) 
    at bsb.core.web.FooInterceptorSpec.Test Foo interceptor loads var to model(FooInterceptorSpec.groovy:9) 

回答

0

设置在规格ModelAndView的请求属性解决了我们的问题:

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

@TestFor(FooInterceptor) 
class FooInterceptorSpec extends Specification { 
    void "Test Foo interceptor loads var to model"() { 
     given: 
      interceptor.currentRequestAttributes().setAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, new ModelAndView('dummy', [:]), 0) 

     when: "A request matches the interceptor" 
      withRequest(controller: 'foo', action: 'index') 
      interceptor.after() 

     then: "The interceptor loads the model" 
      interceptor.doesMatch() 
      interceptor.model.foo == 'bar' 
    } 
}