gpt4 book ai didi

unit-testing - 将模拟服务注入(inject)域类以进行 Grails 单元测试?

转载 作者:行者123 更新时间:2023-11-28 19:45:56 25 4
gpt4 key购买 nike

我正在 Grails 2.1.1 下编写一些基于 Spock 规范的单元测试。我无法将 springSecurityService 注入(inject)到我的单元使用的域对象中。

这是我目前的情况,

@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 因为没有注入(inject) mockSpringSecruityService。我的服务中的 createUser 调用会验证一些参数,然后创建一个 SecUser 域对象。

SecUser 注入(inject)了以下服务以支持密码编码,

class SecUser {
transient springSecurityService

我想不通的是以域类可用的方式注入(inject)此服务。我知道已经有一些帖子与此主题相关,但其中大多数假设测试可以实例化域对象,但在我的例子中,实例化是被测试单元的一部分。

我试过以下方法代替 FIXME,

defineBeans {
mockSpringSecurityService(SpringSecurityService) { bean ->
bean.autowire = true
}
}

但结果我得到了跟随错误,

| groovy.lang.MissingMethodException: No signature of method: grails.plugins.springsecurity.SpringSecurityService.call() is applicable for argument types: (java.lang.Class, skillz.GameAccountServiceSpec$_spock_feature_0_0_closure4_closure5) values: [class grails.plugins.springsecurity.SpringSecurityService, ...] Possible solutions: wait(), any(), find(), dump(), collect(), grep()

有什么想法吗?

最佳答案

我最终解决的问题是,

SecUser.metaClass.encodePassword = { null }

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

我更愿意使用 metaClass 来模拟注入(inject) bean,但是我的尝试是

SecUser.metaClass.getSpringSecurityService = { mockSpringSecurityService }

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

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

关于unit-testing - 将模拟服务注入(inject)域类以进行 Grails 单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com