[JAVA] Validation des messages du journal à l'aide de mockito

Décrit comment utiliser Mockito pour vérifier les messages du journal dans les tests unitaires.

environnement

Les principales bibliothèques sont les suivantes

Bibliothèque version
Junit 4.12
mockito 1.10.19
log4j 2.6.2

J'utilise Maven. Veuillez vous référer au lien ci-dessous pour la version détaillée. pom.xml

Cible de test

Les classes à tester sont les suivantes. L'appel de la méthode sayHello imprime un message dans le journal au niveau INFO. La sortie du journal utilise log4j.

HelloWorld.java


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

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

Code de test

Vous aurez besoin de l'objet Appender Mock pour obtenir les messages du journal. Préparez également un ArgumentCaptor pour obtenir la valeur de l'argument de l'objet Mock.

HelloWorldTest.java


    @Mock
    private Appender mockAppender;

    @Captor
    private ArgumentCaptor<LogEvent> logCaptor;

Définissez l'objet Appender préparé ci-dessus sur log4j. À ce stade, spécifiez la valeur à renvoyer par Mockito afin qu'il fonctionne comme un Appender lorsque l'objet mockAppender est appelé depuis log4j.

HelloWorldTest.java


        Mockito.reset(mockAppender);
        //Définissez le nom de l'appender
        Mockito.when(mockAppender.getName()).thenReturn("MockAppender");
        //Prêt à être utilisé en tant qu'appendeur (2 lignes du bas)
        Mockito.when(mockAppender.isStarted()).thenReturn(true);
        Mockito.when(mockAppender.isStopped()).thenReturn(false);

        //Sortez l'enregistreur ROOT et réglez l'appender.
        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();

Le code de test réel est le suivant. Extrayez le message de la méthode append d'Appender. Vous pouvez également vérifier le nombre d'appels. Cette fois, il est clairement spécifié comme 1 car c'est une fois.

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));
    }

Résumé

Décrit comment vérifier les messages du journal à l'aide de Mockito pour obtenir les arguments de l'objet Appender append. Cela permet la vérification au niveau du journal ainsi que les messages.

Avant de savoir comment faire cela, j'ai eu beaucoup de mal à analyser la sortie des chaînes dans le fichier journal. Dites adieu à de telles difficultés.

Ensemble de code

Le code source est disponible ci-dessous. Si vous souhaitez l'essayer, veuillez vous y référer.

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

Recommended Posts

Validation des messages du journal à l'aide de mockito
Implémentation de la validation à l'aide d'expressions régulières
Personnalisation de la validation
Exemple d'utilisation de vue.config.js
Résumé de l'utilisation de FragmentArgs
Résumé de l'utilisation de DBFlow
Exemple de paramètres utilisant where
Résumé de l'utilisation de ButterKnife
Exemple d'utilisation d'une classe abstraite
Signature et validation à l'aide de java.security.Provider
Limitation de débit à l'aide de RateLimiter of Resilience4j