我最近开始使用log4j2,我试图在我的单元测试中测试我的日志消息。 对于log4j1x api来说这非常简单,但现在使用log4j2它无法正常工作。 我正在使用JUnit 4和Mockito。 我的想法是创建一个模拟appender,然后从append方法捕获Log事件并验证消息。

@Mock
Appender mockAppender;
@Captor
private ArgumentCaptor<LogEvent> logEvent;

在我的@Before方法中,我有以下内容

LoggerContext ctx = (LoggerContext)LogManager.getContext();
Configuration config = ctx.getConfiguration();
ctx.getConfiguration().addAppender(mockAppender);
LoggerConfig rootConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
rootConfig.setLevel(Level.DEBUG);
rootConfig.addAppender(mockAppender, Level.DEBUG, null);
ctx.updateLoggers();

在我的测试方法中

logger.error("test");
verify(mockAppender, times(1)).append(logEvent.capture());

我失败了,说从未调用append方法。 有人对此有什么想法吗? 谢谢

#1楼 票数:2

mockAppender只是一个模拟对象。 如果你没有在@Before方法中跟踪行,那么什么都行不通。

Mockito.reset(mockAppender);
Mockito.when(mockAppender.getName()).thenReturn("MockAppender");
Mockito.when(mockAppender.isStarted()).thenReturn(true);
Mockito.when(mockAppender.isStopped()).thenReturn(false);

就我而言,它对我有用。

#2楼 票数:0

(不是一个真正的答案,但是太长,太难以阅读评论。)

首先,在日志消息上断言似乎有点奇怪,但我确定你有理由。

你的方法对我来说没有错。 虽然不是100%确定记录器上下文本身的生命周期,但最糟糕的情况是每个被测试的类都需要新建一切。 在这种情况下,您的appender不会将其转换为生产代码。 也许简化一点(没有captor)并调试你的测试(你应该能够在某个地方找到新的appender)。

或者考虑如何将记录器配置到组件。 可能更容易模仿这种依赖。

  ask by Gowtham translate from so

未解决问题?本站智能推荐:

1回复

当我通过 JUnit 和 Mockito 测试 Web 应用程序时,Log4j2 出现很多错误

我有一个简单的 log2j2-test 配置文件,它位于 test/resources 目录中 文件位置 而且我有 Dao、Entity 和 Service 类(它仅用于检查如何使用 mockito,所以不要对那里写的内容感到惊讶 我有简单的 JUnit 测试如下 当我运行测试时,它通过
1回复

获取Log4j2日志文件位置以写入包含日期的目录

如何获取log4j日志文件的位置? 我试过这个: 我可以在哪里找到log4j日志文件的存储位置? 但不适用于较新版本的log4j。 我正在创建包含系统日期的文件,但是当我检索路径时,时间戳将发生变化。
1回复

2个日志文件的log4j2配置XML文件,每次运行都有新文件夹

我对log4j2有点陌生。 我正在寻找如何为我们的测试自动化框架配置log4j2.xml文件。 我们需要两个日志文件。 一种是非技术性的,一种具有所有技术细节,例如堆栈跟踪信息。 这意味着将INFO和ERROR消息直接发送到一个文件。 所有消息将定向到另一个文件。 因此,一个文件将包
1回复

如何查看在使用 Ant junitlauncher 和 junitreport 任务运行的 junit5 测试期间生成的所有 log4j2 输出?

我正在运行许多测试类,它们混合使用System.out.println(...)和 Log4j2 log.info(...)日志记录。 我可以在 HTML 报告中看到要运行的第一个测试类的所有日志,但随后的测试似乎只保留了System.out.println(...)直接使用。 如何保留报告中的所有
1回复

Log4j2 Mock Appender

我有一个类,我在其中获取所有属性,并在记录之前隐藏其密码。 我已经迁移到log4j2并想测试这个类,检查log4j2的输出。 它目前使用log4j并且工作,但是当我迁移到log4j2时,我得到了 通缉但未调用:mockAppender.append(); - > a
1回复

log4j2-为特定软件包配置stderr重定向/忽略

我在测试中使用的是第三方库。 该库将异常输出到stderr,它们显示在控制台中。 我想做的就是忽略它们。 我能够编写一个Java黑客代码来拦截stderr System.setErr(new PrintStream(new OutputStream() { public voi
2回复

log4j2.3升级后的Powermock无法重新配置JMX java.lang.LinkageError

我将 log4j 从 1.x 升级到 2.3。 设置 maven 依赖项后,我的项目正在构建并且应用程序运行良好。 但是在构建时,在测试目标中,在已经存在的各种单元测试类中出现低于提到的错误。 我可以通过使用@PowerMockIgnore 找到解决方法。 但是担心更改已写入的所有 100 个文
3回复

如何使用Mockito测试SOAP消息?

我是Mockito的新手,我想我会尝试用它来测试一个SOAP Handler。 然而,事实证明这比我预期/期望的要痛苦得多。 我希望验证我的处理程序能够在SOAPMessage的标头中提取messageID。 但是,从处理程序,到达标题的唯一方法是通过context / message