【问题标题】:Overriding method provided by trait in grails unit testgrails单元测试中trait提供的覆盖方法
【发布时间】:2017-07-04 01:04:44
【问题描述】:

我有一个控制器,它使用 Grails Spring Security Core 插件提供的 isLoggedIn() 函数执行操作。我希望能够对这些操作进行单元测试,因此我需要一种模拟 isLoggedIn() 函数的方法,以便它始终返回 false。这种方法是由一个 trait 提供的,我认为这是我的问题的根源。

我已经尝试向元类添加一个新函数:

UserController.metaClass.isLoggedIn = { -> false}

但是,这似乎不起作用;原来的方法还在被调用。

关于如何实现这一点的任何建议?

【问题讨论】:

    标签: unit-testing grails groovy spring-security grails3


    【解决方案1】:

    你需要将getter定义为:

    UserController.metaClass.getIsLoggedIn = { -> false }
    

    以如下代码为例:

    class UserController { 
      def isLoggedIn = "original"
    }
    
    
    UserController.metaClass.getIsLoggedIn = { -> "get" }
    UserController.metaClass.isLoggedIn    = { -> "direct" }
    
    
    def u = new UserController()
    println u.isLoggedIn
    

    打印:

    get
    

    【讨论】:

    • 此解决方案在使用 loggedIn 而不是 isLoggedIn() 并覆盖 getLoggedIn() 后有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多