[JAVA] Validierung von Protokollnachrichten mit mockito

Beschreibt, wie Mockito zum Überprüfen von Protokollmeldungen in Komponententests verwendet wird.

Umgebung

Die Hauptbibliotheken sind wie folgt

Bibliothek Ausführung
Junit 4.12
mockito 1.10.19
log4j 2.6.2

Ich benutze Maven. Die detaillierte Version finden Sie unter dem folgenden Link. pom.xml

Testziel

Die zu testenden Klassen sind wie folgt. Durch Aufrufen der sayHello-Methode wird eine Nachricht auf INFO-Ebene in das Protokoll gedruckt. Die Protokollausgabe verwendet log4j.

HelloWorld.java


class HelloWorld {
    private Logger logger = LogManager.getLogger(this);

    void sayHello(String name) {
        logger.info("Hello " + name);
    }
}

Testcode

Sie benötigen das Appender Mock-Objekt, um die Protokollnachrichten abzurufen. Bereiten Sie auch einen ArgumentCaptor vor, um den Wert des Arguments vom Mock-Objekt abzurufen.

HelloWorldTest.java


    @Mock
    private Appender mockAppender;

    @Captor
    private ArgumentCaptor<LogEvent> logCaptor;

Setzen Sie das oben vorbereitete Appender-Objekt auf log4j. Geben Sie zu diesem Zeitpunkt den von Mockito zurückzugebenden Wert an, damit dieser als Appender fungiert, wenn das mockAppender-Objekt von log4j aufgerufen wird.

HelloWorldTest.java


        Mockito.reset(mockAppender);
        //Legen Sie den Namen des Appenders fest
        Mockito.when(mockAppender.getName()).thenReturn("MockAppender");
        //Stellen Sie ein, dass Sie bereit sind, als Appender verwendet zu werden (untere 2 Zeilen)
        Mockito.when(mockAppender.isStarted()).thenReturn(true);
        Mockito.when(mockAppender.isStopped()).thenReturn(false);

        //Nehmen Sie den ROOT-Logger heraus und stellen Sie den Appender ein.
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration config = ctx.getConfiguration();

        LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);

        loggerConfig.setLevel(Level.INFO);
        loggerConfig.addAppender(mockAppender, Level.INFO, null);
        ctx.updateLoggers();

Der tatsächliche Testcode lautet wie folgt. Extrahieren Sie die Nachricht aus der Append-Methode von Appender. Sie können auch die Anzahl der Anrufe überprüfen. Dieses Mal wird es eindeutig als 1 angegeben, da es einmal ist.

HelloWorldTest.java


    @Test
    public void outputLogMessage() {
        String name = "World";

        HelloWorld helloWorld = new HelloWorld();
        helloWorld.sayHello(name);

        Mockito.verify(mockAppender, Mockito.times(1)).append(logCaptor.capture());

        String message = logCaptor.getValue().getMessage().getFormattedMessage();
        Level level = logCaptor.getValue().getLevel();
        assertThat(message, is("Hello " + name));
        assertThat(level, is(Level.INFO));
    }

Zusammenfassung

Beschrieben, wie Protokollnachrichten mithilfe von Mockito überprüft werden, um die Argumente des Appender-Append-Objekts abzurufen. Dies ermöglicht die Überprüfung auf Protokollebene sowie Nachrichten.

Bevor ich wusste, wie das geht, hatte ich große Probleme, die in die Protokolldatei ausgegebenen Zeichenfolgen zu analysieren. Verabschieden Sie sich von solchen Nöten.

Satz von Code

Der Quellcode ist unten verfügbar. Wenn Sie es ausprobieren möchten, beziehen Sie sich bitte darauf.

https://github.com/hiroyuki-kaneko/testforlog

Recommended Posts

Validierung von Protokollnachrichten mit mockito
Implementierung der Validierung mit regulären Ausdrücken
Anpassung der Validierung
Beispiel für die Verwendung von vue.config.js
Zusammenfassung der Verwendung von FragmentArgs
Zusammenfassung der Verwendung von DBFlow
Beispiel für Parameter mit where
Zusammenfassung der Verwendung von ButterKnife
Beispiel für die Verwendung einer abstrakten Klasse
Signieren und Validieren mit java.security.Provider
Ratenbegrenzung mit RateLimiter of Resilience4j