gpt4 book ai didi

unit-testing - 如何使用 grails 在单元测试中模拟 springSecurityService

转载 作者:行者123 更新时间:2023-12-04 03:58:55 24 4
gpt4 key购买 nike

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

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

根据项目需求,修改了我的User.groovy类,代码如下:

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

我正在尝试编写单元测试来检查此单元类的约束

我的一个测试如下所示

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

我一直在尝试不同的方法来模拟 springSecurityService 但似乎都失败了。谁能建议一种模拟此服务的方法。

目前我遇到了这个错误。

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)

如果我尝试将它作为集成测试运行(没有模拟),这个测试也会失败。我无法理解我哪里出错了。

最佳答案

我想如果你更换

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

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

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

您应该能够运行此测试。

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

关于unit-testing - 如何使用 grails 在单元测试中模拟 springSecurityService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23496025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com