2011-11-25 31 views
6

Tengo un bean spring que tiene un miembro logger y uso ese registrador para registrar algunas acciones. También he escrito un caso de prueba que utiliza SpringJUnit4ClassRunner. He configurado Log4J con un archivo de propiedades y en cada caso de prueba que inicializar el registrador con estas propiedades:Log4j en JUnit Test case

@BeforeClass 
public static void init() { 
    PropertyConfigurator.configure("src/com/config/log4j.properties"); 
} 

cuando corro una prueba que me da una advertencia

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

Sin embargo, el registrador de my bean escribe mensajes en la ubicación especificada en log4j.properties, es decir, funciona bien. ¿Por qué log4j me da tales advertencias?

+0

Como salida, puede pasar '-Dlog4j.configuration = com/config/log4j.properties' a JVM. El código que ha mencionado se puede eliminar. –

Respuesta

5

Creo que la razón es este código en SpringJUnit4ClassRunner

public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    if (logger.isDebugEnabled()) { 
     logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "]."); 
    } 
    this.testContextManager = createTestContextManager(clazz); 
} 

Si no desea ver la advertencia sobre log4j, simplemente como @DN sugirió simplemente añadir el archivo log4j.properties a su ruta de clase de aplicación, En caso si utiliza la estructura de directorios maven, agregue el archivo log4j.properties a (src/main/resources) que eliminará la advertencia.

2

Porque el Runner ejecuta ejecuciones antes de que Log4J se inicialice.

+0

¿SpringJUnit4ClassRunner requiere Log4j? En caso afirmativo, ¿cómo puedo configurarlo antes de la ejecución del corredor? – maks

+0

@maks No estoy seguro de si es necesario o si utiliza un contenedor de registro. Tener un 'log4j.properties' en la raíz del classpath debería ser suficiente, aunque tendrías que probarlo. –

+0

@maks Commons registra realmente, pero el consejo todavía se aplica. –

11

Quería mantener mi configuración de log4j fuera del classpath predeterminado para usar el registro diferente con la unidad de pruebas & de producción. Lo solucioné subclasificando SpringJUnit4ClassRunner y usando un inicializador de clase estático.

// The new test runner 
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
    try { 
     Log4jConfigurer.initLogging("classpath:test/log4jconfig.xml"); 
    } 
    catch(FileNotFoundException ex) { 
     System.err.println("Cannot Initialize log4j"); 
    } 
    } 

    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    } 
} 

El cambio en la prueba:

@RunWith(JUnit4ClassRunner.class) 
@ContextConfiguration 
@TransactionConfiguration 
@Transactional 
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 
... 

Ahora log4j está configurado antes de que el corredor de pruebas de la primavera se invoca.

+0

¿dónde coloca esto en la estructura de su paquete? –

+0

Guardo esto en un proyecto separado (lo que resulta en un contenedor separado). De esa manera, puedo reutilizar la clase Test Runner entre proyectos. Por lo tanto, el paquete específico es irrelevante, excepto que debe estar dentro del classpath de la clase de prueba. – wbdarby

Cuestiones relacionadas