我在项目中使用了Grails Spring Security插件,现在想对代码进行单元测试。我的控制器中有以下代码:
def index() {
redirect action: 'show', params: [id: springSecurityService.currentUser.id]
}我的测试类包含以下代码:
void testIndex() {
controller.index()
assert "/user/list" == response.redirectedUrl
}此测试失败:
| Running 8 unit tests... 1 of 8
| Failure: testIndex(xxx.UserControllerTests)
| java.lang.NullPointerException: Cannot get property 'currentUser' on null object
at xxx.UserController.index(UserController.groovy:12)
at xxx.UserControllerTests.testIndex(UserControllerTests.groovy:19)如何在测试用例中验证spring security用户?您将如何编写单元测试?
发布于 2012-10-10 03:37:56
你必须使用功能测试来保证安全性。单元测试使用模拟,但没有可用的插件,也没有真正的请求。Spring Security是使用筛选器链实现的,因此您需要一个真正的运行服务器。如果你使用mock,你只是在测试mocking。
发布于 2012-10-10 03:37:20
对于如此简单的东西,我不会为复杂的模拟而烦恼,一个简单的
controller.springSecurityService = [currentUser:[id:1]]就足够了。
发布于 2012-10-10 03:34:27
您对springSecurityService的引用似乎为空。只要您的控制器中有一个名为springSecurityService的字段,它就应该被注入。您是否仅在index方法中将其用作局部变量,而没有将其声明为字段?
我的UserController如下:
class UserController {
/**
* Dependency injection for the springSecurityService.
*/
def springSecurityService
....
}更新
根据您对此答案的评论,您确实在控制器中声明了一个springSecurityService字段。我拿起我的工作应用程序,尝试了一个用我的控制器方法映射你的应用程序的测试:
@TestFor(UserController)
class UserControllerTests {
void testSomething() {
controller.register()
}
}我也有一台NullPointerException。从伯特的回答中(我不知道这一点),我认为springSecurityService实例在单元测试执行的上下文中是空的。
https://stackoverflow.com/questions/12806931
复制相似问题