【发布时间】:2012-05-03 18:50:03
【问题描述】:
我有一个域类,它扩展了一个注入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)
}
}
我想实现一个控制器测试。
@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)
甚至模拟方法
Extra.metaClass.getCurrentUser = { return user1 }
知道如何解决这个问题。
【问题讨论】:
-
您好!我遇到了同样的问题。您是否为您的问题制定了解决方案?或者,也许您可以在没有单元测试自动装配的情况下在域对象中注入服务?
-
这个问题好运吗?,面临同样的问题。
标签: unit-testing grails spring-security mocking