首页 > 解决方案 > 如何在Grails 2单元测试中获取spring security提供的currentUser

问题描述

大家好,我在获取 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”。

希望您能够帮助我。谢谢

标签: unit-testinggrailsspring-securitymocking

解决方案


无法在空对象上获取属性“currentUser”。

表示你没有嘲笑过springSecurityService。让我们在设置部分进行(我假设它在此类中的其他方法中也可能有用):

def springSecurityService

def setup() {
    springSecurityService = Mock(SpringSecurityService)
    controller.springSecurityService = springSecurityService
}

此时,您的代码将开始工作。但是请记住,您始终可以模拟实际登录的用户并随时对其进行测试:

    User user = Mock(User)
    springSecurityService.currentUser >> user

推荐阅读