如何模拟 acegi 身份验证服务以进行单元测试?
Posted
技术标签:
【中文标题】如何模拟 acegi 身份验证服务以进行单元测试?【英文标题】:How do I mock an acegi authenticate service for unit testing? 【发布时间】:2011-08-08 16:49:44 【问题描述】:这是我的 grails 服务类方法:
class SomeService
def authenticateService
def getUserName()
def cid = authenticateService.userDomain().customerid
def uid = authenticateService.userDomain().userid
def userDetails = User.findByCustomerIdAndUserId(cid, uid)
return userDetails.lastName+", "+userDetails.firstName
如何为 acegi 安全插件提供的 authenticateService 创建一个 mock 用于单元测试?
我尝试了一个单元测试:
class SomeServiceTests extends GrailsUnitTestCase
...
...
def testGetUserName()
def service = new SomeService()
def authService = mockFor(AuthenticateService)
authService.demand.userDomain().customerid -> return 111
authService.demand.userDomain().userid -> return 222
service.authenticateService = authService.createMock()
def uName = service.getUserName()
asserNotNull uName
但,
当我运行测试时,它给出:
测试套件:SomeServiceTests 测试运行:1,失败:0,错误:1,经过时间:1.069 秒 导致错误 0 java.lang.ArrayIndexOutOfBoundsException: 0 在 grails.test.DemandProxy.invokeMethod(GrailsMock.groovy:171) 在 SomeServiceTests.testGetUserName(SomeServiceTests.groovy:230)
我无法解决问题。任何帮助表示赞赏,谢谢...
【问题讨论】:
【参考方案1】:这些行对我来说没有意义:
authService.demand.userDomain().customerid -> return 111
authService.demand.userDomain().userid -> return 222
试试这样的方法:
authService.demand.getUserDomain(2..2) -> return [customerid:111, userid: 222]
【讨论】:
以上是关于如何模拟 acegi 身份验证服务以进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Security Bean 中模拟自定义 UserService 详细信息以进行单元测试?
Vue,vuex:如何使用命名空间存储和模拟对组件进行单元测试?
Request.GetOwinContext 在单元测试中返回 null - 如何在单元测试中测试 OWIN 身份验证?