7

我正在 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()

有任何想法吗?

4

1 回答 1

6

我最终做的工作是,

SecUser.metaClass.encodePassword = { null }

在我的域对象encodePassword中是使用springSecurityServicebean 的方法。所以如果我理解正确的话,这只是覆盖这个方法什么都不做(这个方法是无效的)。

我更喜欢使用 metaClass 来伪造注入 bean,但我尝试

SecUser.metaClass.getSpringSecurityService = { mockSpringSecurityService }

当 encodePassword 尝试使用 SpringSecurityService 时会出现 NPE。

我觉得这是一个不太理想的解决方法,所以我希望有人给出一个不那么老套的答案。

于 2013-08-08T21:06:13.563 回答