web-dev-qa-db-fra.com

Où configurer log4j dans une classe de test JUnit?

En regardant le dernier scénario de test JUnit que j'ai écrit, j'ai appelé la méthode BasicConfigurator.configure () de log4j à l'intérieur du constructeur de la classe. Cela a bien fonctionné pour exécuter uniquement cette classe à partir de la commande "run as JUnit test case" d'Eclipse. Mais je me rends compte que c’est inexact: je suis à peu près sûr que notre suite de tests principale exécute toutes ces classes à partir d’un seul processus et que la configuration de log4j devrait donc se dérouler plus haut quelque part.

Mais il me faut encore quelques fois exécuter un scénario de test, auquel cas je veux configurer log4j. Où devrais-je placer l'appel de configuration pour qu'il soit exécuté lorsque le scénario de test s'exécute de manière autonome, mais pas lorsque le scénario de test est exécuté dans le cadre d'une suite plus grande?

82
skiphoppy

La classe LogManager détermine la configuration log4j à utiliser dans un bloc statique qui s'exécute lorsque la classe est chargée. Trois options sont destinées aux utilisateurs finaux:

  1. Si vous spécifiez log4j.defaultInitOverride à false, log4j ne sera pas configuré du tout.
  2. Spécifiez vous-même le chemin du fichier de configuration manuellement et remplacez la recherche par chemin de classe. Vous pouvez spécifier l'emplacement du fichier de configuration directement en utilisant l'argument suivant pour Java:

    -Dlog4j.configuration=<path to properties file>

    dans votre configuration de test runner.

  3. Autorisez log4j à analyser le chemin d'accès aux classes à la recherche d'un fichier de configuration log4j lors de votre test. (le défaut)

Voir aussi le documentation en ligne .

49
Paul Morie

En général, je viens de mettre un fichier log4j.xml dans src/test/resources et de laisser log4j le trouver par lui-même: aucun code requis, l'initialisation par défaut de log4j le récupérera. (Je souhaite généralement configurer mes propres enregistreurs sur 'DEBUG' de toute façon)

58
araqnid

Vous voudrez peut-être vous pencher sur façade de journalisation simple pour Java (SLF4J) . Il s’agit d’une façade qui entoure Log4j et ne nécessite pas d’appel de configuration initial, comme Log4j: Il est également assez facile de changer de Log4j pour Slf4j car les différences d’API sont minimes.

6
James McMahon

J'utilise les propriétés du système dans log4j.xml:

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

et commencez les tests avec:

<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>
5
gavenkoa