Java 如何在JUnit和Mockito中测试2条日志消息

Java 如何在JUnit和Mockito中测试2条日志消息,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我对JUnit和Mockito很陌生。我正在尝试使用JUnit和Mockito编写一个测试用例来验证日志消息。我的代码中有2条日志消息 import org.apache.commons.logging.Log; 导入org.apache.commons.logging.LogFactory; 公共int运行(最终字符串[]args)引发异常{ 如果(参数长度!=2){ log.info(“用法:输入路径输出路径”); log.info(“输入和输出路径必须在同一顺序中”); 系统出口(1);

我对JUnit和Mockito很陌生。我正在尝试使用JUnit和Mockito编写一个测试用例来验证日志消息。我的代码中有2条日志消息

import org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
公共int运行(最终字符串[]args)引发异常{
如果(参数长度!=2){
log.info(“用法:输入路径输出路径”);
log.info(“输入和输出路径必须在同一顺序中”);
系统出口(1);
}
最终字符串inputPath=args[0];
最终字符串outputPath=args[1];
//一些代码
返回0;
}
我编写的测试用例是

import org.apache.log4j.Appender;
导入org.apache.log4j.Level;
导入org.apache.log4j.LogManager;
导入org.apache.log4j.spi.LoggingEvent;
导入org.junit.After;
导入org.junit.Before;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.ArgumentCaptor;
导入org.mockito.Mock;
导入org.mockito.runners.MockitoJUnitRunner;
导入静态org.junit.Assert.assertEquals;
导入静态org.junit.Assert.assertThat;
导入静态org.mockito.mockito.verify;
@RunWith(MockitoJUnitRunner.class)
公共类测试运行{
@嘲弄
私人追加器模拟追加器;
@以前
public void setup(){LogManager.getRootLogger().addAppender(mockAppender);}
@之后
public void teardown(){LogManager.getRootLogger().removeAppender(mockAppender);}
@试验
公共无效testValidArguments(){
//一些代码
getLogger(TryTest.class).info(“用法:输入路径输出路径”);
getLogger.getLogger(TryTest.class).info(“输入和输出路径在同一序列中是必需的”);
ArgumentCaptor参数=ArgumentCaptor.forClass(LoggingEvent.class);
验证(appender,times(2)).doAppend(argument.capture());
assertEquals(Level.INFO,argument.getValue().getLevel());
assertEquals(“用法:输入路径输出路径”,argument.getValue().getMessage());
assertEquals(“输入和输出路径在同一序列中是必需的”,argument.getValue().getMessage());
}
}

我已经看到了一些解决方案,但它们需要创建另一个我不想要的类。同样,当我执行代码时,它会取第二个值,即“输入和输出路径在同一序列中是必需的”。如果只有一条日志消息,代码将正常执行。如果无法解决,我可以将这两条消息放在一个log.info中。但是,我确实希望知道是否有任何可能的解决方案来解决此特定问题。

如果您使用的是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
}
@测试
无效测试(){
Logger=(Logger)LogFactory.getLogger(YourClass.class);
ListAppender ListAppender=新ListAppender();
listpappender.start();
logger.addAppender(listpappender);
YourClass YourClass=新建YourClass();
yourClass.callYourMethodWithLogs();
List logsList=listAppender.List;
//使用日志列表进行断言
}