【问题标题】:Can I override a constructor using metaprogramming limited to a scope in groovy?我可以使用限制在 groovy 范围内的元编程来覆盖构造函数吗?
【发布时间】:2010-10-12 18:50:16
【问题描述】:

我想重写一个类的构造函数进行测试。我可以这样做:

 SomeClass.metaClass.constructor = { Map params -> 
     def instance = BeanUtils.instantiateClass(SomeClass)
     instance.apply(params)
     instance
 }

这可行,但我需要新的构造函数仅应用于某些实例。特别是,我想将此更改的范围限制为闭包。我试着做一个类别:

class SomeClassCategory {
    static def constructor(instance, params) { }
}

use(SomeClassCategory) {
    def x = new SomeClass(params)
}

但这会创建一个名为 constructor 的方法,而不是实际的构造函数。无论如何要在类别中指定构造函数吗?或者我可以仅在 use(Category) 构造之类的块内将更改应用于 SomeClass 的元类吗?

【问题讨论】:

    标签: groovy constructor metaprogramming categories


    【解决方案1】:

    我建议使用 GMock - http://gmock.org/ - 来解决这个问题,尤其是在您进行测试时。它提供了一种选择性地模拟方法,然后验证结果的方法,我相信这正是您所需要的。

    我自己用过,效果很好。

    在他们的文档中,有一个模拟构造函数的示例:

    def mockFile = mock(File, constructor("/a/path/file.txt"))
    mockFile.getName().returns("file.txt")
    
    play {
      def file = new File("/a/path/file.txt")
      assertEquals "file.txt", file.getName()
    }
    

    这可能与部分模拟相结合,应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2015-09-20
      • 2014-03-30
      相关资源
      最近更新 更多