[英]Injecting a mock service into a domain class for a Grails unit test?
我正在Grails 2.1.1下編寫一些基於Spock規范的單元測試。 我無法將springSecurityService
注入到我的單元使用的域對象中。
這是我到目前為止,
@Mock([SecUser])
@TestFor(FooService)
class FooServiceSpec extends Specification {
def "test some stuff"() {
given:
def mockSecUserService = Mock(SecUserService)
mockSecUserService.emailValid(_) >> { true }
mockSecUserService.checkUsername(_) >> { null }
service.secUserService = mockSecUserService
def mockSpringSecurityService = Mock(SpringSecurityService)
mockSpringSecurityService.encodePassword(_) >> { 'tester' }
// FIXME this needs to be injected somehow
def params = [
email: 'unittest@test.com',
username: 'unittester',
password: 'tester',
password2: 'tester'
]
when:
def result = service.createUser(params)
then:
// test results
}
}
所以會發生的事情是我的測試服務會拋出NullPointerException
因為不會注入mockSpringSecruityService。 我的服務中的createUser調用驗證一些參數,然后創建一個SecUser
域對象。
SecUser
注入了以下服務以支持密碼編碼,
class SecUser {
transient springSecurityService
我無法弄清楚的是以域類可用的方式注入此服務。 我知道有一些帖子已經與這個主題相關,但是大多數帖子都認為測試可以實例化域對象,但在我的情況下,實例化是被測單元的一部分。
我試過以下代替FIXME,
defineBeans {
mockSpringSecurityService(SpringSecurityService) { bean ->
bean.autowire = true
}
}
但結果我得到了跟隨錯誤,
| groovy.lang.MissingMethodException:沒有方法簽名:grails.plugins.springsecurity.SpringSecurityService.call()適用於參數類型:(java.lang.Class,skillz.GameAccountServiceSpec $ _spock_feature_0_0_closure4_closure5)值:[class grails.plugins.springsecurity .SpringSecurityService,...]可能的解決方案:wait(),any(),find(),dump(),collect(),grep()
有任何想法嗎?
我最終做的工作是,
SecUser.metaClass.encodePassword = { null }
在我的域對象中, encodePassword
是使用springSecurityService
bean的方法。 因此,如果我理解正確,這只是覆蓋此方法什么也不做(方法是無效的)。
我更喜歡使用metaClass來虛擬注入bean,但是我嘗試了
SecUser.metaClass.getSpringSecurityService = { mockSpringSecurityService }
當encodePassword嘗試使用SpringSecurityService時,會使用NPE。
我覺得這是一個不太理想的工作,所以我喜歡有人給出一個不那么討厭的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.