gpt4 book ai didi

unit-testing - 如何模拟从 Controller 测试类注入(inject)域类的服务?

转载 作者:行者123 更新时间:2023-12-04 12:35:31 26 4
gpt4 key购买 nike

我有一个域类,它扩展了一个注入(inject) spring security core plugin 的抽象类服务。

class Extra extends WithOwner {
String name
}

abstract class WithOwner {
transient springSecurityService
User user

def getCurrentUser() {
return springSecurityService.currentUser
}

def beforeValidate() {
if(!user) {
user = getCurrentUser()
}
}

Boolean isLoggedUserTheOwner(){
return (user?.id == getCurrentUser()?.id)
}
}

我想实现一个 Controller 测试。
@TestFor(ExtraController)
@Mock([Extra, User, UserRole, Role])
class ExtraControllerTests {

void testEdit() {
def utils = new TestUtils()
def user1 = utils.saveUser1()

populateValidParams(params)
def extra = new Extra(params)
extra.user = user1
assert extra.save() != null

params.id = extra.id


def model = controller.edit() // Line 69
assert model.extraInstance == extra
}
}

如果我运行上述测试,我会得到:

test-app ExtraController.testEdit --unit --echoOut
|运行 1 个单元测试... 1 of 1
--testEdit 的输出--
|失败:testEdit(com.softamo.movi​​lrural.ExtraControllerTests)
| java.lang.NullPointerException:无法在空对象上获取属性“currentUser”
在 com.softamo.movi​​lrural.WithOwner.getCurrentUser(WithOwner.groovy:8)
在 com.softamo.movi​​lrural.WithOwner.isLoggedUserTheOwner(WithOwner.groovy:18)
在 com.softamo.movi​​lrural.ExtraController.edit(ExtraController.groovy:39)
在 com.softamo.movi​​lrural.ExtraControllerTests.testEdit(ExtraControllerTests.groovy:69)
|完成 1 个单元测试,1 个在 853 毫秒内失败

我曾尝试像这样模拟安全服务但没有成功:
Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1)

甚至 mock 该方法
Extra.metaClass.getCurrentUser = { return user1 }

知道我该如何解决这个问题。

最佳答案

Grails 2.x 支持使用'defineBeans' 闭包为测试环境定义spring bean。
它支持 Controller 等中的依赖注入(inject),我不确定它是否也适用于域对象。从理论上讲,它应该在域对象/ Controller /服务之间保持一致

http://grails.org/doc/latest/guide/single.html#testing -“测试 Spring Beans”部分。

关于unit-testing - 如何模拟从 Controller 测试类注入(inject)域类的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10275803/

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