2012-04-20 3 views
1

Я работаю над устаревшим кодом и записываю некоторые тесты junit (я знаю, неправильный порядок, неважно) с помощью jmock (также не был моим выбором, я ничего не могу поделать) и У меня есть класс, который выполняет некоторые подробные протоколирования, возится со строками в целом. Мы используем log4j для ведения журнала, и я хочу протестировать эти зарегистрированные сообщения. Я думал о насмешливом классе Logger, но я не знаю, как это сделать.mocking Logger.getLogger() using jmock

Как правило, мы Logger сделать так:

private static final Logger LOG = Logger.getLogger(SomeClass.class); 

Кто-нибудь есть идеи, как издеваться метод .getLogger (класс) или любой другой идеи, как проверить, что именно было зарегистрировано?

ответ

3

Вы можете написать собственный appender и перенаправить на него весь вывод.

+0

Ха! Я даже сделал это так несколько месяцев назад, но забыл об этом. Это то, что я сделаю, спасибо – Edheene

3

Если вы действительно думаете, что вам нужно это сделать, вам необходимо взглянуть на PowerMock. В частности, это способность к mock static methods. PowerMock интегрируется с EasyMock и Mockito, но некоторые охоты могут привести к тому, что вы обнаружите интеграцию JMock, если вам придется придерживаться этого.

Сказав это, я считаю, что создание вашей рамки теста, чтобы он записывает хорошо, не затрагивая тесты, и обеспечение тесты не зависят от того, что получает регистрируется лучший подход. Я когда-то должен был поддерживать некоторые модульные тесты, которые проверяли, что было зарегистрировано, и они были самыми хрупкими и бесполезными модульными тестами, которые я когда-либо видел. Я переписал их, как только у меня было время, чтобы это сделать.

+1

+1 Я тоже должен был поддерживать тесты, издевавшиеся над журналом. Полное безумие. – artbristol

+0

Должен признаться, около 80% моего «переписывания» нажимало кнопку удаления ;-) – Jon

+0

Но это означало бы изменение тестируемого класса, который я не должен делать (за исключением, конечно, ситуации, если я нахожу ошибки). Я тоже не доволен этой ситуацией, но я ничего не могу с этим поделать прямо сейчас, возможно, в будущем. спасибо в любом случае – Edheene

0

Проверить этот похожий вопрос: How to mock with static methods?

И, кстати, это легче выполнить поиск существующих qusetion к вашей проблеме, чем задать вопрос и ждать ответа.

0

Самый простой способ, который я нашел, - использовать объекты mock log4j в JMockit.

Вам просто нужно оная аннотацию

@UsingMocksAndStubs(Log4jMocks.class) 

на тестовый класс и весь код тронутого класса тестера будет использовать фиктивный объект Logger.

См this

Но это обыкновение записывать сообщения. Вы можете избежать неприятностей со статическими объектами.