Nun stand ich die Tage vor der Aufgabe, zu testen, ob in einer Situation eine Log-Ausgabe erzeugt wird. Das kann man natürlich sehen, wenn man den Test ausführt - es soll aber automatisch getestet werden.
Also habe ich überlegt, wie ich denn ggf. das Logging-Framework mocken könnte. Das geht abernicht einfach, da ich den Logger per Lombok injeziert hatte. Aber - man kann ja dann auf die log-Variable zugreifen. Wie aber nun dort noch einbauen, dass überprüfbar wird, dass geloggt wurde?? Wie sollte das gehen?
Eigentlich ganz einfach. Man schreibt einen eigenen Appender. Dieser speichert die Logging-Events in einer Liste, die dann in dem Test abgefragt werden kann:
public class TestAppender extends AppenderSkeleton { @Getter private List<String> messages = new ArrayList<>(); @Override protected void append(LoggingEvent loggingEvent) { String msg = loggingEvent.getMessage().toString(); messages.add(msg); } @Override public void close() { // } @Override public boolean requiresLayout() { return false; } }
In der Test-Klasse kann das nun folgendermaßen verwendet werden:
@Test void getValueTest() { Logger logger = Logger.getLogger(ExcelRow.class); TestAppender appender = new TestAppender(); logger.addAppender(appender); assertEquals("Group-1", row.getStringValue("Surname)); assertEquals("Found multiple definitions for row 'USER_GROUP'.",
appender.getMessages().get(0));
}
Die hier verwendete Methode Appender::getMessages() liefert eine Liste von org.apache.log4j.spi.LoggingEvent zurück. Diese hat noch weitere Methoden, um bspw. den verwendeten Log-Leven o.ä. abzufragen - das würde aber dem Rahmen dieses Artikels sprengen und bleibt dem geneigten Programmierer überlassen...
Fertig - so testet man, ob Log-Ausgaben per Log4j erzeugt worden sind... :-)