我的Spock测试无法获得主要ID

Ant*_*t's 0 grails spock

我有一个像这样的控制器:

@Secured(['ROLE_USER','IS_AUTHENTICATED_FULLY'])
    def userprofile(){
        def user = User.get(springSecurityService.principal.id)
        params.id = user.id
        redirect (action : "show", params:params)
    }
Run Code Online (Sandbox Code Playgroud)

我想在spock中测试控制器上面的控制器,所以我写了一个像这样的测试代码:

def 'userProfile test'() {

        setup:
        mockDomain(User,[new User(username:"amtoasd",password:"blahblah")])

        when:
        controller.userprofile()

        then:
        response.redirectUrl == "/user/show/1"
    }
Run Code Online (Sandbox Code Playgroud)

当我运行我的测试时,此测试失败并显示以下错误消息:

java.lang.NullPointerException: Cannot get property 'principal' on null object
    at mnm.schedule.UserController.userprofile(UserController.groovy:33)
Run Code Online (Sandbox Code Playgroud)

在集成测试的情况下:

class UserSpec extends IntegrationSpec {

    def springSecurityService

    def 'userProfile test'() {

        setup:
        def userInstance = new User(username:"antoaravinth",password:"secrets").save()
        def userInstance2 = new User(username:"antoaravinthas",password:"secrets").save()
        def usercontroller = new UserController()
        usercontroller.springSecurityService = springSecurityService

        when:
        usercontroller.userprofile()

        then:
        response.redirectUrl == "/user/sho"
    } 

}
Run Code Online (Sandbox Code Playgroud)

我也得到了同样的错误.

什么地方出了错?

提前致谢.

Bur*_*ith 6

你似乎没有做任何提供真实或模拟的东西springSecurityService,所以当然它是null(在单元测试中没有依赖注入;你必须模拟单元测试类没有提供的所有东西).添加它setup:应该工作:

controller.springSecurityService = [principal: [id: 42]]
Run Code Online (Sandbox Code Playgroud)