簡體   English   中英

將模擬服務注入到Grails單元測試的域類中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM