2009-05-18 14 views
73

Al examinar el último caso de prueba de JUnit que escribí, llamé al método LogConjugador de log4j() dentro del constructor de la clase. Eso funcionó bien para ejecutar solo esa clase del comando "ejecutar como JUnit test case" de Eclipse. Pero me doy cuenta de que es incorrecto: estoy bastante seguro de que nuestro conjunto de pruebas principal ejecuta todas estas clases a partir de un proceso y, por lo tanto, la configuración de log4j debería estar ocurriendo más arriba en algún lugar.¿Dónde configuro log4j en una clase de prueba JUnit?

Pero todavía necesito ejecutar un caso de prueba algunas veces, en cuyo caso deseo que log4j se configure. ¿Dónde debo colocar la llamada de configuración para que se ejecute cuando el caso de prueba se ejecute de manera independiente, pero no cuando el caso de prueba se ejecuta como parte de un conjunto más grande?

Respuesta

44

La clase LogManager determina qué configuración de log4j usar en un static block que se ejecuta cuando se carga la clase. Hay tres opciones destinadas a usuarios finales:

  1. No configurar log4j; usa la configuración predeterminada
  2. Permita que log4j explore el classpath para un archivo de configuración log4j durante su prueba.
  3. Especifique manualmente la ruta del archivo de configuración y anule la búsqueda de classpath. Puede especificar la ubicación del archivo de configuración directamente mediante el siguiente argumento a java:

    -Dlog4j.configuration=<path to properties file>

    en su configuración corredor de prueba.

Véase también el online documentation.

+0

¿Cómo se sabe es un "archivo de configuración log4j"? ¿Cuál es el nombre del archivo? (log4j.xml?) – Chad

+1

@Chad: He editado mi respuesta para responder a su pregunta. Consulte el enlace al bloque estático para ver exactamente cómo se implementa esto. –

+0

Estoy usando log4j2 y tuve que usar la siguiente configuración para indicar un archivo: '-Dlog4j.configurationFile = log4j2.xml'. Además, si intenta depurar carga/inicio, esta configuración puede ser útil: '-Dlog4j2.debug = true'. – Kent

6

Es posible que desee mirar en Simple Logging Facade for Java (SLF4J). Es una fachada que envuelve Log4j que no requiere una llamada de configuración inicial como Log4j. También es bastante fácil cambiar Log4j para Slf4j ya que las diferencias API son mínimas.

52

En general, simplemente coloco un archivo log4j.xml en src/test/resources y dejo que log4j lo encuentre solo: no se requiere código, la inicialización predeterminada de log4j lo recogerá. (Me suelen quiero fijar mi propio madereros a 'debug' de todos modos)

+5

Para las pruebas de construcción estándar, configuraría Log4j como advertencia o incluso error. Si las pruebas tienen éxito (también pruebas negativas) no debería haber registro, lo que llama la atención de los usuarios. – keiki

4

utilizo las propiedades del sistema en log4j.xml:

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

y empezar con las pruebas:

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