издевательство над Logger.getLogger() с использованием jmock

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

Как обычно у нас Logger делается так:

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

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


person Edheene    schedule 20.04.2012    source источник


Ответы (4)


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

person Andrzej Jozwik    schedule 20.04.2012
comment
Ха! Я даже сделал это таким образом несколько месяцев назад, но забыл об этом. Это то, что я сделаю, спасибо - person Edheene; 20.04.2012

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

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

person Jon    schedule 20.04.2012
comment
+1 Мне тоже приходилось поддерживать тесты, которые издевались над регистратором. Полное безумие. - person artbristol; 20.04.2012
comment
Должен признаться, около 80% моих переписываний приходилось на кнопку удаления ;-) - person Jon; 20.04.2012
comment
Но это будет означать изменение тестируемого класса, чего я не должен делать (за исключением, конечно, ситуации, если я найду какие-либо ошибки). Я тоже не в восторге от этой ситуации, но я ничего не могу с этим поделать прямо сейчас, возможно, в будущем. Спасибо, в любом случае - person Edheene; 20.04.2012
comment
Программное обеспечение мягкое — предполагается, что вы сможете его изменить. Избавьте себя и свою команду от боли и поговорите со своим руководителем о внесении изменений сейчас, а не позже. Что плохого в том, чтобы спросить? - person Jon; 20.04.2012
comment
И если подумать, как использование PowerMock потребует от вас изменения тестируемого класса? - person Jon; 20.04.2012

Проверьте этот похожий вопрос: Как имитировать статические методы?

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

person adranale    schedule 20.04.2012

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

Вам просто нужно добавить аннотацию

@UsingMocksAndStubs(Log4jMocks.class)

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

См. это.

Но это не будет регистрировать сообщения. С этим вы можете избавиться от хлопот, связанных со статическими объектами.

person n3o    schedule 24.01.2014