jUnit + jMock и log4j - PullRequest
       56

jUnit + jMock и log4j

4 голосов
/ 23 января 2012

Я дал задание сделать JUnit + JMock для программы, созданной другим программистом.Большая часть класса имеет этот статический регистратор полей, то есть:

static Log logger = LogFactory.getLog(SomeClass.class.getName());

Я создаю экземпляр SomeClass , создав его экземпляр внутри моего setUp() метода.Когда я запускаю свой класс jUnit, я получаю это сообщение об ошибке:

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException:  (No such file or directory)

Я попытался выполнить ручную настройку log4j, вызвав DOMConfigurator.configure("log4j.xml"); внутри метода setUp(), но я все еще получаю то же самоесообщение об ошибке выше.

Вопрос в следующем:

  • Как мне запустить мой модульный тест + mocking в классе, который вызывает другой класс, который использует LogFactory.getLog
  • Должен ли я настроить log4j в моем методе настройки так, чтобы макетирование и модульное тестирование выполнялись без исключения?
  • Как мне это сделать.

Ответы [ 2 ]

4 голосов
/ 23 января 2012

У вас есть два варианта ...

В проектах Maven второй вариант прост, поскольку вам просто нужно создать log4j.properties в папке test / resources.

1 голос
/ 24 января 2012

На самом деле у меня есть два типа проблем, которые я считаю одним, проблема log4j в jUnit. Вы можете продолжить работу с jUnit + jMock, даже если log4j не настроен должным образом, он выдаст исключение, но не остановит выполнение jUnit.

Проблема, с которой я столкнулся:
1. Исключение FileNotFoundException с сообщением «сбой вызова setFile (null, true)»
2. jMock неожиданная ошибка вызова

Я решил номер 1 (хотя я все еще мог продолжить модульное тестирование даже с исключением log4j), поставив аргумент VM -Dlog4j.configuration=file:/C:/log4j/log4j.xml. Я получал исключение, потому что он использовал log4j.xml внутри скомпилированного каталога (папка вывода по умолчанию для скомпилированных классов Java). Этот log4j имеет этот параметр <param name="File" value="${error.file}"/>. Поэтому log4j ищет файл журнала с именем файла $ {error.file} (которого не существует). Как и то, что я сказал выше, я решил это, поставив аргумент VM выше.

Извлеченный урок: если вы получаете FileNotFoundException при выполнении log4j, попробуйте указать -Dlog4j.debug в качестве аргумента виртуальной машины, чтобы увидеть, куда log4j извлекает файл конфигурации.

Я решаю номер 2, завершая все ожидаемые объекты внутри метода, который я тестирую. Хотя сообщение jMock довольно неоднозначно.

Извлеченный урок: неожиданный вызов обычно означает, что в вашем тестовом методе вы пропускаете объекты или фиктивные объекты, которые используются в методе, который вы используете для модульного тестирования. Это также означает, что вы не установили ожидания для объекта, который он пытается вызвать

...