Как проверить 2 сообщения журнала в JUnit и Mockito - PullRequest
1 голос
/ 27 февраля 2020

Я очень плохо знаком с JUnit и Mockito. Я пытаюсь написать контрольный пример, используя JUnit и Mockito для проверки сообщений журнала. В моем коде есть 2 сообщения журнала.

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public int run(final String[] args) throws Exception {
    if (args.length != 2) {
      log.info("Usage: input-path output-path");
      log.info("Input and output path are required in the same sequence");
      System.exit(1);
    }
    final String inputPath = args[0];
    final String outputPath = args[1];
    //some code
    return 0;
}

Написанный мною тестовый пример:

import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

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

@RunWith(MockitoJUnitRunner.class)
public class testRun {

    @Mock
    private Appender mockAppender;

    @Before
    public void setup() {LogManager.getRootLogger().addAppender(mockAppender);}

    @After
    public void teardown() {LogManager.getRootLogger().removeAppender(mockAppender);}

    @Test
    public void testValidArguments() {
        //some code
 Logger.getLogger(TryTest.class).info("Usage: input-path output-path");
    Logger.getLogger(TryTest.class).info("Input and output path are required in the same sequence");
    ArgumentCaptor<LoggingEvent> argument = ArgumentCaptor.forClass(LoggingEvent.class);
    verify(appender,times(2)).doAppend(argument.capture());
    assertEquals(Level.INFO, argument.getValue().getLevel());
    assertEquals("Usage: input-path output-path", argument.getValue().getMessage());
    assertEquals("Input and output path are required in the same sequence", argument.getValue().getMessage());
     }
}

Я видел некоторые решения, но они требуют создания другого класса, который я делаю не хочу. Также, пока я выполняю код, он принимает второе значение, т. Е. «Путь ввода и вывода требуется в одной и той же последовательности». Код выполняется нормально, если есть только одно сообщение журнала. Я могу поместить оба сообщения в один log.info, если это не может быть решено. Тем не менее, я пойду sh, чтобы узнать, есть ли какое-либо возможное решение этой конкретной проблемы.

1 Ответ

0 голосов
/ 27 февраля 2020

Если вы используете регистратор sl4j, вы можете использовать ListAppender:

@Test
void test() {
    Logger logger = (Logger) LogFactory.getLogger(YourClass.class);

    ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
    listAppender.start();
    logger.addAppender(listAppender);

    YourClass yourClass = new YourClass();
    yourClass.callYourMethodWithLogs();

    List<ILoggingEvent> logsList = listAppender.list;
    //make assertions with logList
}
...