[JAVA] Tester le comportement de l'enregistreur de sortie de journal lors de l'utilisation d'API de journalisation externes telles que SLF4J

Contexte

Je souhaite vérifier le journal de la sortie du journal au moment du test lors de l'utilisation d'une API de journalisation externe telle que SLF4J.

Objectif

Simulez le journal afin que la sortie du journal puisse être contrôlée par le code de test

Pour ceux qui souhaitent jeter un œil au code, "[Exemple de code](https://qiita.com/yusha3/items/c9576bbe8b6cc5b27897#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%" Vous pouvez le trouver dans le chapitre "AB% E3% 82% B3% E3% 83% BC% E3% 83% 89)".

approche

Flux de procédure

  1. Définition d'ArgmentCaptor
  2. Définissez le Logger de la classe cible et insérez l'appender fictif.
  3. Attrapez l'appel spécifié par l'instance fictive de l'enregistreur.

1. Définition d'ArgmentCaptor

  @Captor
  private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

ArgmentCaptor est utilisé lorsque vous souhaitez vérifier qu'une méthode stubbed dans une classe mockito a été appelée correctement ou que les arguments appropriés ont été passés à cette méthode. Cette fois, nous capturerons l'argument de LoggingEvent, qui est le type de sortie de journal.

2. Définissez le Logger de la classe cible et insérez l'appender fictif.

	  @Mock
	  private Appender mockAppender;

      final Logger logger = (Logger) LoggerFactory.getLogger([Nom de la classe à tester].class);
      logger.addAppender(mockAppender);

Définissez votre propre variable de journalisation sans utiliser @ Slf4j et ajoutez un Appender simulé à la journalisation. Appender est l'interface utilisée pour définir la destination de sortie du journal. Appender peut être réglé sur Logger avec la méthode ʻaddAppender () . Ici, vous pouvez simuler la destination de sortie du journal de l'enregistreur en préparant un simulacre Appender et ʻaddAppender () it.

3. Attrapez l'appel spécifié par l'instance fictive de l'enregistreur

     verify(mockAppender).doAppend(captorLoggingEvent.capture());
     assertEquals("INFO", captorLoggingEvent.getValue().getLevel().toString());

doAppend a un objet événement comme argument. Le rôle de la journalisation Appender attachée

Seul le dernier journal peut être intercepté par la méthode ci-dessus. Assignez à une liste pour capturer tous les journaux.

//Extraire uniquement les journaux d'application
      List<LoggingEvent> events = captorLoggingEvent.getAllValues().stream()														 
                                  .collect(Collectors.toList());

Exemple de code

Classe principale

package com.zozo.tech.search.personalize.api.logic;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class Sample {

  public void doLogging() {
    log.info("sample");
    log.info("sample access_log.");
    log.info("sample access_log 2.");
  }
}

Classe d'essai

package com.zozo.tech.search.personalize.api.logic;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.Appender;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class SampleTest {

  @Captor
  private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

  @Mock
  private Appender mockAppender;

  @InjectMocks
  @Autowired
  Sample sample;

  @BeforeEach
  void setUp() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  void test() throws Exception {
    Logger logger = (Logger) LoggerFactory.getLogger(Sample.class);
    logger.addAppender(mockAppender);

    sample.doLogging();

    verify(mockAppender).doAppend(captorLoggingEvent.capture());
    //Vérifiez si le journal de niveau INFO est sorti
    assertEquals("INFO", captorLoggingEvent.getValue().getLevel().toString());

    //Extraire uniquement les journaux d'application
    List<LoggingEvent> events = captorLoggingEvent.getAllValues().stream()
        .filter(e -> e.getMessage().contains("access_log"))
        .collect(Collectors.toList());

    assertEquals(2, events.size());
  }
}

Matériel de référence

Recommended Posts

Tester le comportement de l'enregistreur de sortie de journal lors de l'utilisation d'API de journalisation externes telles que SLF4J
[Java] [Spring] Tester le comportement de l'enregistreur
Précautions lors de l'utilisation de querySelector () (comme un périphérique lors de la spécification de l'attribut de nom)
Lorsque le formulaire tel que Select of Materialize ne fonctionne pas correctement
Inspectez le contenu de la sortie du journal pendant le test unitaire Java (aucune simulation utilisée)
Utiliser Webmock avec Rspec
Comment utiliser l'API Chain
Afficher les prévisions météorologiques à l'aide d'OpenWeatherMap, une API externe de Ruby
[Rails] Code de test à l'aide de Rspec
Tester le comportement de l'enregistreur de sortie de journal lors de l'utilisation d'API de journalisation externes telles que SLF4J
Téléchargement d'images à l'aide de CarrierWave ~ Test Rspec ~
Comment insérer une bibliothèque externe
[RSpec] Test unitaire (avec gem: factory_bot)
[Pour les débutants Rails] Résumé de l'utilisation de RSpec (obtenir un aperçu)
Bibliothèque de tests unitaires Java Artery-Easy to use
[Docker] Création d'un environnement pour utiliser Hugo
Comment lire un fichier MIDI à l'aide de l'API Java Sound (spécifiez le périphérique MIDI à utiliser)