如何在Grails 2单元测试中获取spring security提供的currentUser
Posted
技术标签:
【中文标题】如何在Grails 2单元测试中获取spring security提供的currentUser【英文标题】:How to get the currentUser provided by spring security in Grails 2 unit testing 【发布时间】:2018-12-27 03:48:09 【问题描述】:大家好,我在获取 spring 提供的当前用户时遇到了麻烦。
这是我的单元测试代码
void "Test if adding project will sucess"()
given:
def createProjectMock = mockFor(UserService)
createProjectMock.demand.createNewProject Map projectMap ->
return true
controller.userService = createProjectMock.createMock()
when: "saveProject is execute"
controller.saveProject()
then: "page will to the list to view the saved project"
response.redirectedUrl == '/user/index2'
这是我的控制器
def saveProject(ProjectActionCommand projectCmd)
def currentUser = springSecurityService.currentUser
if (projectCmd.hasErrors())
render view: 'createProject', model: [projectInstance: projectCmd, user:currentUser]
else
def getProjectMap = [:]
getProjectMap = [
projectName: params.projectName,
user: currentUser
]
def saveProject = userService.createNewProject(getProjectMap)
if (saveProject)
redirect view: 'index2'
else
render 'Error upon saving'
这是我的服务
Project createNewProject(Map projectMap)
def createProject = new Project()
createProject.with
projectName = projectMap.projectName
user = projectMap.user
createProject.save(failOnError:true, flush: true)
我总是收到这个错误:
无法在空对象上获取属性“currentUser”。
希望你能帮助我。谢谢
【问题讨论】:
【参考方案1】:无法在空对象上获取属性“currentUser”。
表示你没有嘲笑过springSecurityService。让我们在设置部分进行(我假设它在此类中的其他方法中也可能有用):
def springSecurityService
def setup()
springSecurityService = Mock(SpringSecurityService)
controller.springSecurityService = springSecurityService
此时您的代码将开始工作。但是请记住,您也可以随时模拟实际登录的用户并随时对其进行测试:
User user = Mock(User)
springSecurityService.currentUser >> user
【讨论】:
以上是关于如何在Grails 2单元测试中获取spring security提供的currentUser的主要内容,如果未能解决你的问题,请参考以下文章
如何在单元测试中针对 Spring Security 对用户进行身份验证
如何在 Grails 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试
如何在 Grails 单元测试中使用 Spock 模拟 passwordEncoder