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.
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)".
Flux de procédure
@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.
@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.
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());
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.");
}
}
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());
}
}
Recommended Posts