我正在使用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但它已關閉。