He encontrado una solución, vea mi propia respuesta a continuación. ¿Alguien tiene uno más elegante?¿Puedo ejecutar las pruebas JUnit automáticamente una vez con todos los registros activados y una vez con todos los registros deshabilitados?
Quiero hacer esto para aumentar la cobertura del código y encontrar errores sutiles.
asumir la siguiente clase a ensayar:
public class Foo {
private final Logger logger = LoggerFactory.getLogger(Foo.class);
public void bar() {
String param=[..];
if(logger.isInfoEnabled()) logger.info("A message with parameter {}", param);
if(logger.isDebugEnabled()) {
// some complicated preparation for the debug message
logger.debug([the debug message]);
}
}
}
y la siguiente prueba de clase:
public class FooTest {
@Test
public void bar() {
Foo foo=new Foo();
foo.bar();
}
}
Una herramienta de código-cobertura como, por ejemplo, Cobertura informará correctamente que solo se han verificado algunas de las ramas condicionales.
la información y la depuración se activan o desactivan para el registrador.
Además de verse mal en su puntaje de cobertura, esto representa un riesgo real.
¿Qué pasa si hay algún efecto secundario causado por el código dentro if (logger.isDebugEnabled())? ¿Qué pasa si su código solo funciona si DEPURACIÓN está habilitada y falla miserablemente si el nivel de registro está establecido en INFO? (En realidad, esto sucedió en uno de nuestros proyectos: p)
Así que mi conclusión es que el código contiene declaraciones registrador debe siempre ser probados una vez con todo el registro habilitado y una vez con todo el registro desactivado ...
Es Hay una manera de hacer algo así con JUnit? Sé cómo habilitar o deshabilitar globalmente todos mis registros en Logback, por lo que el problema es: ¿cómo puedo ejecutar las pruebas dos veces, una con el registro habilitado, una vez con el registro deshabilitado?
p.s. Estoy al tanto de this question pero no creo que sea un duplicado. Me preocupan menos los valores de cobertura absolutos, pero sobre errores sutiles y difíciles de encontrar que podrían estar contenidos dentro de un if (logger.isDebugEnabled()).
Nota: no se considera una buena práctica administrar niveles de registro para una aplicación típica escribiendo la configuración desde la aplicación. Los marcos de registro están diseñados para gestionar esto externo a la aplicación. –
Son pruebas unitarias, no es una aplicación. Además, ciertamente hay casos en los que cambiar la configuración de nivel de loog tiene sentido, p. una opción de línea de comandos '-v' de una aplicación de consola. – Huxi
Puede configurar el logback programáticamente sin Joran. Tendrás código más corto. Además, si la configuración se realizó programáticamente, puede restaurar la configuración anterior al final de cada prueba. Holler en logback-dev si desea ver el código de muestra. De lo contrario, muy buen trabajo! – Ceki