Где мне настроить log4j в тестовом классе JUnit?

85

Глядя на последний написанный мной тестовый пример JUnit, я вызвал метод BasicConfigurator.configure () log4j внутри конструктора класса. Это отлично сработало для запуска только одного класса из команды Eclipse «запустить как тестовый пример JUnit». Но я понимаю, что это неправильно: я почти уверен, что наш основной набор тестов запускает все эти классы из одного процесса, и поэтому конфигурация log4j должна происходить где-то выше.

Но мне все равно нужно несколько раз запускать тестовый пример, и в этом случае я хочу настроить log4j. Куда мне поместить вызов конфигурации, чтобы он запускался, когда тестовый пример запускается автономно, но не когда тестовый пример запускается как часть более крупного набора?

скифоппи
источник
Я собираюсь предположить, что здесь log4j 1.x, а не 2 ...
rogerdpack

Ответы:

51

В LogManagerклассе определяет , какие log4j конфигурации для использования в статическом блоке , который запускается при загрузке класса. Для конечных пользователей есть три варианта:

  1. Если вы укажете log4j.defaultInitOverridefalse, он вообще не будет настраивать log4j.
  2. Укажите вручную путь к файлу конфигурации и переопределите поиск пути к классам. Вы можете указать местоположение файла конфигурации напрямую, используя следующий аргумент java:

    -Dlog4j.configuration=<path to properties file>

    в конфигурации вашего тестового бегуна.

  3. Разрешите log4j сканировать путь к классам в поисках файла конфигурации log4j во время теста. (по умолчанию)

См. Также онлайн-документацию .

Пол Мори
источник
Как он узнает, что это «файл конфигурации log4j»? Какое имя файла? (log4j.xml?)
Чад
1
@Chad: Я отредактировал свой ответ, чтобы ответить на ваш вопрос. Пожалуйста, посмотрите ссылку на статический блок, чтобы узнать, как именно это реализовано.
Пол Мори
Я использую log4j2 и я должен был использовать следующий параметр , чтобы указать файл: -Dlog4j.configurationFile=log4j2.xml. Кроме того , если вы пытаетесь отлаживать загрузки / запуск, этот параметр может быть полезным: -Dlog4j2.debug=true.
Кент
Есть ли способ уточнить этот ответ?
markthegrea
61

Обычно я просто помещаю файл log4j.xml в src / test / resources и позволяю log4j найти его сам по себе: код не требуется, инициализация log4j по умолчанию подберет его. (Обычно я все равно хочу установить свои собственные регистраторы на «DEBUG»)

аракнид
источник
6
Для стандартного тестирования здания я бы установил Log4j на предупреждение или даже ошибку. Если тесты успешны (также отрицательные тесты), не должно быть журналов, которые привлекают внимание пользователей.
keiki
2
Да, это правильно для log4j 1.x. Очевидно, для log4j2 вы можете использовать более «экзотические» файлы, такие как файл log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Вы можете изучить Simple Logging Facade для Java (SLF4J) . Это фасад, который окружает Log4j и не требует вызова начальной настройки, такого как Log4j. Также довольно легко переключить Log4j на Slf4j, поскольку различия в API минимальны.

Джеймс МакМахон
источник
5

Я использую системные свойства в log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

и начать тесты с:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
гавенкоа
источник