如何在使用grails的单元测试中模拟springSecurityService [英] How to mock springSecurityService in unit tests using grails

查看:164
本文介绍了如何在使用grails的单元测试中模拟springSecurityService的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的grails项目中使用了Spring安全性。我已经安装了spring-security-core插件和spring-security-ui插件。



我用于Person和Authority的域类分别是User和Role

根据项目要求,我已修改了我的User.groovy类,其代码如下所示:

  class User {
transient springSecurityService

//必填项
字符串employeeId
字符串firstName
字符串lastName
字符串密码
字符串emailId

//其他字段
字符串mobileNumber
字符串地址
字符串城市
字符串zipCode

用户管理器

static hasMany = [previousPasswords:String]

boolean enabled = true
布尔accountExpired
布尔accountLocked
布尔passwordExpired
$ b $静态瞬变= ['springSecurityService' ]

static constraint = {
employeeId blank:false,unique:true
firstName blank:false
lastName blank:false
password blank:false,密码:true ,验证器:{val,obj - >
if(obj.previousPasswords){
return!obj.previousPasswords.contains(encode(val.toUpperCase()))
}
return true
}
emailId blank:false,email:true
$ b $ mobileNumber可为空:true
可空:true
可空:true
zipCode可空:true

经理可为空:true

前面的密码display:false,editable:false
}

static mapping = {
密码列:'`密码''
}

设置<角色> getAuthorities(){
UserRole.findAllByUser(this).collect {it.role} as Set
}

def beforeInsert(){
PreviousPasswords = [encode( password.toUpperCase())]
encodePassword()
}
$ b $ def beforeUpdate(){
if(isDirty('password')){
previousPasswords<< encode(password.toUpperCase())
encodePassword()
}
}

保护字符串encode(String pwd){
return springSecurityService.encodePassword pwd)
}

protected void encodePassword(){
password = springSecurityService.encodePassword(password)
}
}

我试图编写单元测试来检查这个单元类的约束条件

我的一个测试看起来如下

  void如果employeeId可以为空或不唯一(){
给定:

def springSecurityService = mockFor(SpringSecurityService,true)
springSecurityService.encodePassword(){String pwd - >返回null}

// def springSecurityServiceFactory = mockFor(SpringSecurityService,true)
// def mockSpringSecurityService = Mock(SpringSecurityService)
// mockSpringSecurityService.metaClass.encodePassword = {String password - >返回null}
// User.metaClass.encodePassword = {return null}
// User.metaClass.encode = {password - >返回null}
// User.metaClass.getSpringSecurityService = {mockSpringSecurityService}
$ b $ when'employeeId is blank'
def user = new User(employeeId:)
user.springSecurityService = springSecurityService

then:'validation failed'
!user.validate()
user.errors.getFieldError(employeeId)。codes.contains( nullable)

when'employeeId is unique'
user = new User(employeeId:empId1,firstName:f_name,lastName:l_name,password:password ,emailId:test@hptest.com)
user.springSecurityService = springSecurityService

然后:'验证成功'
user.validate()

user.save(flush:true,failOnError:true)
mockForConstraintsTests(User,[user])

when'employeeId is non unique'
def user_2 = new用户(employeeId:empId1)
user_2.springSecurityService = springSecurityService

然后:'验证失败'
!user_2.validate()
user_2.errors.getFieldError(employeeId)。codes.contains(unique)
}

我一直在尝试使用不同的方法来模拟springSecurityService,但都似乎失败。任何人都可以提出一种方法来嘲笑这项服务。



目前我收到这个错误。

  groovy.lang.MissingMethodException:没有方法签名:grails.test.GrailsMock.encodePassword()适用于参数类型:(com.hp.bots.UserSpec $ _ $ spock_feature_0_0_closure1)values:[com。 hp.bots.UserSpec$_$spock_feature_0_0_closure1@18324cd] 
在com.hp.bots.UserSpec.test中,如果employeeId可以是空白或非唯一的(UserSpec.groovy:25)

如果我尝试将它作为集成测试运行(没有模拟),该测试也会失败。我无法理解我出错的地方。

解决方案

我想如果您替换

  springSecurityService.encodePassword(){String pwd  - >返回null} 

with

  springSecurityService.demand.encodePassword(){String pwd  - >返回null} 

  user.springSecurityService = springSecurityService.createMock()(grails 2.3.7)
和user_2

您应该可以运行此测试。



您可以在这里查看更多文档。 http://grails.org/doc/2.3.7/guide/testing.html


I am using Spring security in my grails project. I have installed the spring-security-core plugin and spring-security-ui plugin.

The domain classes I have used for Person and Authority are User and Role respectively

As per project requirements, I have modified my User.groovy class and the code for the same is as below:

class User {
transient springSecurityService

//Mandatory Fields
String employeeId
String firstName
String lastName
String password
String emailId

//Other Fields
String mobileNumber
String address
String city
String zipCode

User manager

static hasMany = [previousPasswords: String]

boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired

static transients = ['springSecurityService']

static constraints = {
    employeeId blank: false, unique: true
    firstName blank: false
    lastName blank: false
    password blank: false, password: true, validator: { val, obj ->
        if(obj.previousPasswords) { 
            return !obj.previousPasswords.contains(encode(val.toUpperCase()))
        }
        return true
    }
    emailId blank: false, email: true

    mobileNumber nullable: true
    address nullable: true
    city nullable: true
    zipCode nullable: true

    manager nullable: true

    previousPasswords display: false, editable: false
}

static mapping = {
    password column: '`password`'
}

Set<Role> getAuthorities() {
    UserRole.findAllByUser(this).collect { it.role } as Set
}

def beforeInsert() {
    previousPasswords = [encode(password.toUpperCase())]
    encodePassword()
}

def beforeUpdate() {
    if (isDirty('password')) {
        previousPasswords << encode(password.toUpperCase())
        encodePassword()
    }
}

protected String encode(String pwd) {
    return springSecurityService.encodePassword(pwd)
}

protected void encodePassword() {
    password = springSecurityService.encodePassword(password)
}
}

I am trying to write Unit tests to check the constraints for this unit class

One of my test looks as below

    void "test if employeeId can be blank or non-unique"() {
    given:

    def springSecurityService = mockFor(SpringSecurityService,true)
    springSecurityService.encodePassword(){String pwd -> return null}

//      def springSecurityServiceFactory = mockFor(SpringSecurityService,true)
//      def mockSpringSecurityService = Mock(SpringSecurityService)
//      mockSpringSecurityService.metaClass.encodePassword = {String password ->     return null}
//      User.metaClass.encodePassword = { return null }
//      User.metaClass.encode = {password -> return null }
//      User.metaClass.getSpringSecurityService = { mockSpringSecurityService }

    when: 'employeeId is blank'
    def user = new User(employeeId: "   ")
    user.springSecurityService= springSecurityService

    then: 'validation fails'
    !user.validate()
    user.errors.getFieldError("employeeId").codes.contains("nullable")

    when: 'employeeId is unique'
    user = new User(employeeId: "empId1", firstName: "f_name", lastName: "l_name", password: "password", emailId: "test@hptest.com")
    user.springSecurityService= springSecurityService

    then: 'validation succeeds'
    user.validate()

    user.save(flush: true, failOnError: true)
    mockForConstraintsTests(User, [user])

    when: 'employeeId is non unique'
    def user_2 = new User(employeeId: "empId1")
    user_2.springSecurityService= springSecurityService     

    then: 'validation fails'
    !user_2.validate()
    user_2.errors.getFieldError("employeeId").codes.contains("unique")
}

I have been trying different ways to mock springSecurityService but all seem to fail. Can anyone suggest a way to mock this service.

Currently I am getting this error.

groovy.lang.MissingMethodException: No signature of method:                   grails.test.GrailsMock.encodePassword() is applicable for argument types: (com.hp.bots.UserSpec$_$spock_feature_0_0_closure1) values: [com.hp.bots.UserSpec$_$spock_feature_0_0_closure1@18324cd]
at com.hp.bots.UserSpec.test if employeeId can be blank or non-unique(UserSpec.groovy:25)

This test also fails if I try to run it as an integration test (without mocking). I am not able to understand where I am going wrong.

解决方案

I guess if you replace

springSecurityService.encodePassword(){String pwd -> return null}

with

  springSecurityService.demand.encodePassword(){String pwd -> return null}

and

    user.springSecurityService= springSecurityService.createMock() (grails 2.3.7) 
and for user_2

you should be able to get this test running.

you could have a look here for further documentation. http://grails.org/doc/2.3.7/guide/testing.html

这篇关于如何在使用grails的单元测试中模拟springSecurityService的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆