我正在使用Grails 2.3.8并尝试为使用服务的筛选器创建单元测试。使用模拟服务的单元测试筛选器
过滤器:
class LicenseFilters {
def licenseService
def filters = {
all(controller:'*', action:'*') {
before = {
if(!licenseService.checkLicense()){
redirect(controller:"licenseExpired")
return false
}
}
}
}
}
该规范,第一次尝试:
@TestFor(ExecutionTraceController)
@Mock(LicenseFilters)
class LicenseFiltersSpec extends Specification{
void "Test filter redirects when license is wrong"() {
given:
LicenseFilters bean=applicationContext.getBean("com.nortia.sgmentia.license.LicenseFilters")
bean.licenseService=this.buildLicenseServiceStub(false)
when:
withFilters(action:"list") {
controller.list()
}
then:
response.redirectedUrl == '/licenseExpired'
}
private LicenseService buildLicenseServiceStub(boolean ok){
LicenseService result=Stub(LicenseService)
result.checkLicense() >> ok
return result
}
}
但事实证明(由调试)说,我从上下文抢豆它是不一样的因此我收到请求我仍然得到一个NPE。
在第二次尝试我尝试使用defineBeans:
void "Test filter redirects when license is wrong"() {
given:
defineBeans {
licenseService(MethodInvokingFactoryBean){
targetObject = this
targetMethod= "buildLicenseServiceStub"
arguments=[false]
}
}
when:
withFilters(action:"list") {
controller.list()
}
then:
response.redirectedUrl == '/licenseExpired'
}
但嘲笑豆既不豆实例化,也不inyected。
我应该尝试将服务手动输入过滤器吗? 发生了此问题https://jira.grails.org/browse/GRAILS-8976但它已关闭。