我有一个域类,它扩展了一个注入(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.movilrural.ExtraControllerTests)
| java.lang.NullPointerException:无法在空对象上获取属性“currentUser”
在 com.softamo.movilrural.WithOwner.getCurrentUser(WithOwner.groovy:8)
在 com.softamo.movilrural.WithOwner.isLoggedUserTheOwner(WithOwner.groovy:18)
在 com.softamo.movilrural.ExtraController.edit(ExtraController.groovy:39)
在 com.softamo.movilrural.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”部分。