È possibile in qualche modo intercettare la registrazione (SLF4J + logback) e ottenere un InputStream
(o qualcos'altro che sia leggibile) tramite un caso di test JUnit ...?Come intercettare la registrazione SLF4J tramite un test JUnit?
risposta
È possibile creare un custom appender
public class TestAppender extends AppenderBase<LoggingEvent> {
static List<LoggingEvent> events = new ArrayList<>();
@Override
protected void append(LoggingEvent e) {
events.add(e);
}
}
e configurare logback-test.xml per usarlo. Ora siamo in grado di controllare la registrazione degli eventi dal nostro test:
@Test
public void test() {
...
Assert.assertEquals(1, TestAppender.events.size());
...
}
È possibile utilizzare slf4j-test dal http://projects.lidalia.org.uk/slf4j-test/. Sostituisce l'intera implementazione di logback slf4j con la propria implementazione di slf4j api per i test e fornisce una API per asserire contro eventi di registrazione.
esempio:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<classpathDependencyExcludes>
<classpathDependencyExcludes>ch.qos.logback:logback-classic</classpathDependencyExcludes>
</classpathDependencyExcludes>
</configuration>
</plugin>
</plugins>
</build>
public class Slf4jUser {
private static final Logger logger = LoggerFactory.getLogger(Slf4jUser.class);
public void aMethodThatLogs() {
logger.info("Hello World!");
}
}
public class Slf4jUserTest {
Slf4jUser slf4jUser = new Slf4jUser();
TestLogger logger = TestLoggerFactory.getTestLogger(Slf4jUser.class);
@Test
public void aMethodThatLogsLogsAsExpected() {
slf4jUser.aMethodThatLogs();
assertThat(logger.getLoggingEvents(), is(asList(info("Hello World!"))));
}
@After
public void clearLoggers() {
TestLoggerFactory.clear();
}
}
Grazie per questa risposta alternativa! Sembra molto utile e probabilmente tenterò questo approccio anche in futuro! Sfortunatamente, ho già accettato l'altra risposta che è anche corretta. – carlspring
ho avuto problemi durante il test linea di tronchi come: LOGGER.error (messaggio, eccezione).
La soluzione descritta in http://projects.lidalia.org.uk/slf4j-test/ tenta di affermare anche l'eccezione e non è facile (e secondo me inutile) ricreare lo stacktrace.
ho risolto in questo modo:
import org.junit.Test;
import org.slf4j.Logger;
import uk.org.lidalia.slf4jext.LoggerFactory;
import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple;
import static uk.org.lidalia.slf4jext.Level.ERROR;
import static uk.org.lidalia.slf4jext.Level.INFO;
public class Slf4jLoggerTest {
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jLoggerTest.class);
private void methodUnderTestInSomeClassInProductionCode() {
LOGGER.info("info message");
LOGGER.error("error message");
LOGGER.error("error message with exception", new RuntimeException("this part is not tested"));
}
private static final TestLogger TEST_LOGGER = TestLoggerFactory.getTestLogger(Slf4jLoggerTest.class);
@Test
public void testForMethod() throws Exception {
// when
methodUnderTestInSomeClassInProductionCode();
// then
assertThat(TEST_LOGGER.getLoggingEvents()).extracting("level", "message").contains(
tuple(INFO, "info message"),
tuple(ERROR, "error message"),
tuple(ERROR, "error message with exception")
);
}
}
Questo ha così il vantaggio di non avere dipendono Hamcrest matchers biblioteca.
- 1. sintassi di registrazione slf4j
- 2. Registrazione parametrizzata SLF4J utilizzando il metodo varargs
- 3. Registrazione durante il test tramite Gradle
- 4. Tempo di registrazione necessario per eseguire i test JUnit
- 5. Intercept Log Messages slf4j
- 6. Come attivare/disattivare la registrazione tramite Log4net
- 7. Come escludere la registrazione commons da un progetto scala/sbt/slf4j?
- 8. JUnit test si blocca
- 9. JUnit opzionali test/richieste
- 10. Come abilitare la registrazione di Ehcache
- 11. come esportare la suite di test (JUnit) come jar eseguibile
- 12. junit test case generator
- 13. Struts 2.3.14 junit test
- 14. Raggruppamento di test JUnit
- 15. Come disabilitare la registrazione per una dipendenza specifica in SBT?
- 16. JUnit descrizione del test
- 17. Test unità JUnit e Clojure
- 18. Test JUnit per un timeout previsto
- 19. Come intercettare la registrazione http AngularJS $ per la visualizzazione nella pagina
- 20. Numeri di riga di registrazione di Scala - slf4s/slf4j?
- 21. Come iniettare un bean @Named in un test Junit
- 22. Inizializzazione SLF4J - Registratori sostitutivi
- 23. JUnit esegue test all'interno di un JAR
- 24. registrazione SLF4J su file vs DB vs Solr
- 25. Come eseguire JMH da test JUnit interni?
- 26. Eseguire test JUnit in parallelo
- 27. Junit Test parametrizzati insieme a Powermock - come?
- 28. Verifica registrazione evento tramite Moq
- 29. come testare il comparatore al test junit
- 30. Come configurare Spring e SLF4J in modo che possa ottenere la registrazione?
Nota: se si utilizza logback classic + slf4j è necessario utilizzare 'ILoggingEvent' anziché' LoggingEvent'. Questo è quello che ha funzionato per me. – etech
@Evgeniy Dorofeev Potresti mostrare come configurare logback-test.xml? – hipokito
Suppongo che sia necessario cancellare gli eventi 'dopo ogni esecuzione del test. –