【发布时间】:2013-08-08 17:31:11
【问题描述】:
我正在 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) 值:[类 grails.plugins.springsecurity.SpringSecurityService, ...] 可能的解决方案:wait()、any()、find()、dump()、collect()、 grep()
有什么想法吗?
【问题讨论】:
-
您是否也尝试过使用元类?喜欢
SecUser.metaClass.springSecurityService = mockSpringSecurityService。顺便说一句,def springSecurityService也可以用来代替transient springSecurityService我猜。 (默认情况下,在域类中任何类型为 def 的东西都应该是瞬态的) -
你能试试this similar way吗?但这并不能帮助我解决问题。
-
@dmahapatro,是的,那是我尝试过的众多文章之一,但我认为那篇文章是针对旧的圣杯的。我对元类方法有一些运气,我很快就会发布一些东西。
标签: unit-testing testing grails groovy spock