2013-09-11 4 views
1

Я видел много примеров того, как издеваться над статическим методом в классе.Как мне издеваться над статическим свойством Groovy?

Я хочу высмеять статическое свойство класса, которое инициализируется в его определении.

Что-то вроде:

class MyClass { 
    private static log = LogFactory.getLog(this) 
} 

Я хочу издеваться войти собственность, для того, чтобы в моем тесте он должен быть пустым, и он не должен инициализироваться.

+0

В вашей настройке() тестовой записи вы можете напрямую написать MyClass.log = null? –

+0

нет, поскольку он сначала инициализирует свойство, затем он помещает нуль. Я не хочу, чтобы он перешел к методу «LogFactory.getLog». – Dvora

+0

вы можете использовать статический блок. Попробуйте использовать следующий код: static {Myclass.metaClass.static.getLog = { return "what you need" }} –

ответ

0

сделать статический метод геттер:

static def getLog() { 
    return log 
} 

Использование metaClass.static издеваться метода:

Myclass.metaClass.static.getLog = { 
    return "what you need" 
} 
+0

Это все еще проблематично, поскольку он все еще пытается вызвать метод LogFactory.getLog() для инициализации свойства , – Dvora

+0

Вы полагаете, что u должен удалить 'private static log = LogFactory.getLog (this)' и заменить его на satatic method 'getLog()', поэтому он не будет инициализирован при загрузке класса. – rxn1d

+0

Этот класс я предпочитаю не менять. Он используется уже из нескольких мест. Благодаря! – Dvora

0

Вы имеете в виду «войти» как свойство, но на самом деле это не так. Предполагая, что MyClass является Groovy класса, тем свойство объявляется без частного или публичного модификатора, например:

class MyClass { 
    static log = LogFactory.getLog(this) 
} 

Что у вас есть частная статическая переменный с инициализатором. В этом случае методы доступа к ресурсам не генерируются, и переменная не считается свойством.

Поскольку это приватная переменная с инициализатором, и вы заявляете, что не хотите менять класс, вы не можете остановить запуск инициализатора. Поэтому самое лучшее, что можно сделать здесь, - выкрикнуть вызов getLog(), чтобы вернуть null. Простым, но грубым подходом будет:

LogFactory.metaClass.static.getLog = { 
    return null 
} 

, но это убьет весь поиск журнала во всем приложении. Это может быть нормально для простого модульного теста, но более конкретным решением является использование Groovy mocks (MockFor и StubFor), что позволит вам высмеивать вызов getLog в определенном блоке кода. Вы можете узнать больше here

Как интересно, почему вы не хотите, чтобы переменная журнала инициализировалась?

Смежные вопросы