首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails Spring安全测试

Grails Spring安全测试
EN

Stack Overflow用户
提问于 2012-10-10 03:21:47
回答 3查看 2.5K关注 0票数 5

我在项目中使用了Grails Spring Security插件,现在想对代码进行单元测试。我的控制器中有以下代码:

代码语言:javascript
复制
def index() {
    redirect action: 'show', params: [id: springSecurityService.currentUser.id]
}

我的测试类包含以下代码:

代码语言:javascript
复制
void testIndex() {      
    controller.index()
    assert "/user/list" == response.redirectedUrl
}

此测试失败:

代码语言:javascript
复制
| 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用户?您将如何编写单元测试?

EN

回答 3

Stack Overflow用户

发布于 2012-10-10 03:37:56

你必须使用功能测试来保证安全性。单元测试使用模拟,但没有可用的插件,也没有真正的请求。Spring Security是使用筛选器链实现的,因此您需要一个真正的运行服务器。如果你使用mock,你只是在测试mocking。

票数 7
EN

Stack Overflow用户

发布于 2012-10-10 03:37:20

对于如此简单的东西,我不会为复杂的模拟而烦恼,一个简单的

代码语言:javascript
复制
controller.springSecurityService = [currentUser:[id:1]]

就足够了。

票数 4
EN

Stack Overflow用户

发布于 2012-10-10 03:34:27

您对springSecurityService的引用似乎为空。只要您的控制器中有一个名为springSecurityService的字段,它就应该被注入。您是否仅在index方法中将其用作局部变量,而没有将其声明为字段?

我的UserController如下:

代码语言:javascript
复制
class UserController {

    /**
     * Dependency injection for the springSecurityService.
     */
    def springSecurityService

    ....
 }

更新

根据您对此答案的评论,您确实在控制器中声明了一个springSecurityService字段。我拿起我的工作应用程序,尝试了一个用我的控制器方法映射你的应用程序的测试:

代码语言:javascript
复制
@TestFor(UserController)
class UserControllerTests {

    void testSomething() {
        controller.register()
    }
}

我也有一台NullPointerException。从伯特的回答中(我不知道这一点),我认为springSecurityService实例在单元测试执行的上下文中是空的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12806931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档