2009-05-18 7 views
73

Mit Blick auf den letzten JUnit-Testfall, den ich geschrieben habe, habe ich log4j's BasicConfigurator.configure() -Methode im Klassenkonstruktor aufgerufen. Das hat gut funktioniert, um nur diese einzelne Klasse aus dem Eclipse-Befehl "Ausführen als JUnit-Testfall" auszuführen. Aber mir ist klar, dass es falsch ist: Ich bin mir ziemlich sicher, dass unsere Testsuite alle diese Klassen in einem Prozess ausführt, und daher sollte die Konfiguration von Log4j irgendwo höher stattfinden.Wo konfiguriere ich log4j in einer JUnit Testklasse?

Aber ich muss noch ein Testfall selbst einige Male ausführen, in diesem Fall möchte ich log4j konfiguriert. Wo sollte ich den Konfigurationsaufruf platzieren, damit er ausgeführt wird, wenn der Testfall eigenständig ausgeführt wird, aber nicht, wenn der Testfall als Teil einer größeren Suite ausgeführt wird?

Antwort

44

Die Klasse LogManager legt fest, welche log4j-Konfiguration in einem static block verwendet wird, der beim Laden der Klasse ausgeführt wird. Es gibt drei Optionen für Endbenutzer:

  1. Konfigurieren Sie log4j nicht; Verwenden Sie die Standardkonfiguration.
  2. Lassen Sie log4j den Klassenpfad für eine log4j-Konfigurationsdatei während des Tests scannen.
  3. Geben Sie den Pfad zur Konfigurationsdatei manuell an und überschreiben Sie die Classpath-Suche. Sie können die Position der Konfigurationsdatei angeben, direkt durch das folgende Argument an java mit:

    -Dlog4j.configuration=<path to properties file>

    in Ihrer Test-Runner-Konfiguration.

Siehe auch die online documentation.

+0

Wie wird es wissen es ist eine "log4j Konfigurationsdatei?" Wie lautet der Dateiname? (log4j.xml?) – Chad

+1

@Chad: Ich habe meine Antwort bearbeitet, um Ihre Frage zu beantworten. Bitte beachten Sie den Link zum statischen Block, um genau zu sehen, wie dies implementiert wird. –

+0

Ich verwende log4j2 und ich musste die folgende Einstellung verwenden, um eine Datei anzugeben: '-Dlog4j.configurationFile = log4j2.xml'. Wenn Sie versuchen, das Laden/Starten zu debuggen, kann diese Einstellung nützlich sein: '-Dlog4j2.debug = true'. – Kent

6

Sie möchten vielleicht in Simple Logging Facade for Java (SLF4J) suchen. Es ist eine Fassade, die sich um Log4j wickelt, die keinen ersten Setup-Aufruf wie Log4j erfordert. Es ist auch ziemlich einfach, Log4j für Slf4j auszuschalten, da die API-Unterschiede minimal sind.

52

Ich lege in der Regel nur eine log4j.xml-Datei in src/test/resources und lass log4j es selbst finden: kein Code erforderlich, die Standard-log4j-Initialisierung wird es aufnehmen. (Ich will typischerweise meine eigenen Logger 'DEBUG' gesetzt sowieso)

+5

Für Standard-Bautests würde ich Log4j auf Warnung oder sogar Fehler einstellen. Wenn die Tests erfolgreich sind (auch negative Tests), sollte es keine Protokollierung geben, die die Aufmerksamkeit der Benutzer auf sich zieht. – keiki

4

I Systemeigenschaften in log4j.xml verwenden:

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

und beginnen Tests mit:

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