单元测试具有瞬态属性的域 [英] Unit testing a domain with transient property

查看:117
本文介绍了单元测试具有瞬态属性的域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图对Spring Security Core Plugin生成的用户域进行单元测试。控制器是使用grails generate-all生成的。
该域名有一个名为springSecurityService的临时属性。在我的单元测试中,我试图嘲笑该服务并将此瞬态变量分配给我的模拟版本。然而,我得到这个错误:

 没有这样的属性:springSecurityService类:com.myapp.security.SecUser可能的解决方案:
springSecurityService groovy.lang.MissingPropertyException:No such property:springSecurityService for class:
com.myapp.security.SecUser at com.myapp.security.SecUserControllerTests.setUp(SecUserControllerTests.groovy:26)

以下是我的网域:

  class SecUser {
transient springSecurityService
字符串用户名
字符串密码
布尔启用
布尔accountExpired
....
)def beforeInsert(){
encodePassword()
}
protected void encodePassword(){
password = springSecurityService.encodePassword(password)
}
}

以下是我的测试的样子:

  package com.myapp.security 

import o rg.junit。*
导入grails.test.mixin。*
导入com.myapp.system。*
导入grails.plugins.springsecurity。*

@ TestFor(SecUserController)
@Mock([SecUser,SpringSecurityService])
class SecUserControllerTests {

@Before void setUp(){
def service = mockFor(SpringSecurityService)
service.demand.encodePassword(1..2){a - > return'd3jk3j4ls234'}
def control = service.createMock()
SecUser.springSecurityService = control
}

不知道我在做什么错误,甚至我甚至可以用transient属性做这样的事情?

  @Before void setUp(){$ b $>可能是模型的情况, b def service = mockFor(SpringSecurityService)
//使用groovy MetaClass运行时
service.metaclass.encodePassword = {def a - > 'd3jk3j4ls234'}
SecUser.springSecurityService =服务
}

或更多静态解决方案:

  @Before void setUp(){
secUser.springSecurityService = [
encodePassword:{ def a - > 'd3jk3j4ls234'}
] as SpringSecurityService
}


I am trying to unit test a controller for User domain generated by Spring Security Core Plugin. The controller was generated with grails generate-all. The domain has a transient property called springSecurityService. In my unit test I am trying to mock that service and assign this transient variable to my mocked version. However, I get this error :

No such property: springSecurityService for class: com.myapp.security.SecUser Possible solutions:
springSecurityService groovy.lang.MissingPropertyException: No such property: springSecurityService for class: 
com.myapp.security.SecUser at com.myapp.security.SecUserControllerTests.setUp(SecUserControllerTests.groovy:26)

Here is my domain look like:

class SecUser {
    transient springSecurityService
    String username
    String password
    boolean enabled
    boolean accountExpired
    ....
    def beforeInsert() {
        encodePassword()
    }
    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

Here is how my test look like:

 package com.myapp.security

 import org.junit.*
 import grails.test.mixin.*
 import com.myapp.system.*
 import grails.plugins.springsecurity.*

 @TestFor(SecUserController)
 @Mock([SecUser,SpringSecurityService])
 class SecUserControllerTests {

    @Before void setUp() { 
       def service = mockFor(SpringSecurityService)
       service.demand.encodePassword(1..2) { a -> return 'd3jk3j4ls234'}
       def control = service.createMock()
       SecUser.springSecurityService = control
   }

Not sure what I am doing wrong or even I can even do something like this with transient property?

解决方案

Could be a mockup situation, See if this works:

@Before void setUp() { 
    def service = mockFor(SpringSecurityService)
    // using the groovy MetaClass runtime
    service.metaclass.encodePassword = {def a -> 'd3jk3j4ls234'}
    SecUser.springSecurityService = service
}

or a more static solution:

@Before void setUp() { 
    secUser.springSecurityService = [
        encodePassword : {def a -> 'd3jk3j4ls234'}
    ] as SpringSecurityService
}

这篇关于单元测试具有瞬态属性的域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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