Могу ли я переопределить конструктор, используя метапрограммирование, ограниченное областью действия в groovy? - PullRequest
1 голос
/ 12 октября 2010

Я бы хотел переопределить конструктор класса для тестирования.Я могу сделать это так:

 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 вместо фактического конструктора.Есть ли способ указать конструктор в категории?Или я могу применить изменения к метаклассу SomeClass только в блоке, подобном конструкции use(Category)?

1 Ответ

1 голос
/ 12 августа 2011

Я бы предложил использовать 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()
}

Это, в сочетании с частичной насмешкой, должно решить вашу проблему.

...