Не могу получить основной идентификатор в моем тесте Спока - PullRequest
0 голосов
/ 24 марта 2012

У меня есть такой контроллер:

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

Я хочу протестировать контроллер над контроллером в споке, поэтому я написал такой тестовый код:

def 'userProfile test'() {

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

        when:
        controller.userprofile()

        then:
        response.redirectUrl == "/user/show/1"
    }

Когда язапустить мой тест, этот тест не пройден с таким сообщением об ошибке:

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

И в случае теста интеграции:

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"
    } 

}

Я также получаю ту же ошибку.

Что пошло не так?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 24 марта 2012

Похоже, вы ничего не сделали для обеспечения реального или макета springSecurityService, поэтому, конечно, он нулевой (в модульных тестах нет внедрения зависимостей; вам нужно высмеивать все, что не предусмотрено классом модульного теста) , Добавление этого в setup: должно работать:

controller.springSecurityService = [principal: [id: 42]]
0 голосов
/ 27 апреля 2016

Что касается меня, я создал вложенный класс. У меня были проблемы с

springSecurityService.getPrincipal()

потому что это только для чтения

class SService {

    User principal

    void setPrincipal(User user){
        this.principal = user
    }

    User getPrincipal(){
        return this.principal
    }
}

Затем в вашем тесте

def setup() {
    User first = User.findByUsername('admin') ?: new User(
            username: 'admin',
            password: 'password',
            email: "first@email.com",
            lastName: 'First',
            firstName: 'First').save(flush: true, failOnError: true)
    SService sservice = new SService()
    controller.springSecurityService = new SService()
    controller.springSecurityService.setPrincipal(first)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...