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...  :-)