代码之家  ›  专栏  ›  技术社区  ›  mkoryak

在groovy中使用私有构造函数将闭包映射到对象

  •  0
  • mkoryak  · 技术社区  · 14 年前

    我正在使用groovy为测试用例创建一些模拟类。我基本上是在创建虚拟对象,其中所有的方法都返回null,这样我就可以运行我的测试用例。

    我使用以下语法:

    MessageFactory.instance = ["getMessage": {a,b,c,d -> "dummy"}] as MessageFactory
    

    所以在这里,我试图用我的on-fake工厂对象覆盖singleton实例。这个 问题是MessageFactory的构造函数碰巧是私有方法 . 当我运行上面的代码时,这给了我一个非法访问异常。我可以在groovy中创建一个代理并克服私有构造函数的问题吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Northover    14 年前

    如果您有权访问MessageFactory并愿意对其进行修改,则可以使用标准依赖项注入解决方案,如下所述: mock singleton …虽然不是特别 凹槽 .

    否则,我找到的最佳解决方法是重写单例实例本身的方法,如下所示:

    @Singleton
    class Test{
        def method(){"Unmocked method called"}
    }
    
    
    def test = Test.instance
    test.metaClass.method = {-> null}
    
    test.method() // Now returns null
    

    自然,作为一个单例,这个实例不会改变(至少在理论上是这样的)。。。因此,以这种方式重写方法实际上是全局的。

    编辑: 或者你可以用 GMock ,它支持构造函数模拟(除其他外)。