我正在 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()
有任何想法吗?