如何在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

Grails Spring 安全测试

在 Grails 2.2 中是不是可以对 mongodb 动态属性进行单元测试?

grails Grails 单元测试中的应用程序访问