Де я можу налаштувати log4j у тестовому класі JUnit?


85

Переглядаючи останній тестовий випадок JUnit, який я писав, я зателефонував методу logCj BasicConfigurator.configure () всередині конструктора класу. Це чудово працювало для запуску саме цього єдиного класу з команди Eclipse "запустити як тест JUnit". Але я розумію, що це неправильно: я майже впевнений, що наш основний набір тестів запускає всі ці класи з одного процесу, і тому конфігурація log4j повинна відбуватися десь вище.

Але мені все одно потрібно кілька разів запустити тестовий приклад, і в цьому випадку я хочу налаштувати log4j. Де слід розмістити виклик конфігурації, щоб він запускався, коли тестовий запуск працює автономно, але не коли тестовий кейс запускається як частина більшого набору?


Я збираюся припустити log4j 1.x тут, а не 2 ...
rogerdpack

Відповіді:


51

У LogManagerкласі визначає , які log4j конфігурації для використання в статичному блоці , який запускається при завантаженні класу. Існує три варіанти, призначені для кінцевих користувачів:

  1. Якщо ви вказали log4j.defaultInitOverrideзначення false, це не налаштує 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.