如何模拟 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 详细信息以进行单元测试?

我如何模拟 auth0 身份验证以进行测试?

如何在 Angular 组件中模拟服务功能以进行单元测试

Vue,vuex:如何使用命名空间存储和模拟对组件进行单元测试?

Request.GetOwinContext 在单元测试中返回 null - 如何在单元测试中测试 OWIN 身份验证?

Grails - Acegi:自定义身份验证方法