我有一个像这样的控制器:
@Secured(['ROLE_USER','IS_AUTHENTICATED_FULLY'])
def userprofile(){
def user = User.get(springSecurityService.principal.id)
params.id = user.id
redirect (action : "show", params:params)
}
我想在spock中测试控制器上方的控制器,所以我写了一个这样的测试代码:
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"
}
}
我也得到同样的错误。
出了什么问题?
提前致谢。
答案 0 :(得分:6)
你似乎没有做任何提供真实或模拟springSecurityService
的事情,所以当然它是null(在单元测试中没有依赖注入;你必须模拟单元测试不提供的所有内容)类)。在setup:
中添加此内容应该有效:
controller.springSecurityService = [principal: [id: 42]]
答案 1 :(得分:0)
至于我,我已经创建了嵌套类。
我确实遇到了问题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)
}