是的,当日志记录正在执行所需的操作时,我们应该测试日志记录。例如,在某些外部应用程序中有钩子,用于扫描日志中的某些事件。在这种情况下,您当然希望确保完成日志记录。
当然,您不想测试每个日志记录事件,我认为应该只测试ERRER(而不是全部)。
使用现代日志记录框架(如 SLF4j),您只需注入一个自定义处理程序,该处理程序将 的事件存储在内存中,并且可以在以后断言。
现在我想到的有两个:
SLF4J测试:不需要修改日志记录配置,但需要注入日志记录工厂,这可能会导致代码被修改。
SLF4J测试:不像slf4jtesting那么强大,似乎没有被开发,但与现有代码配合得很好。除了用于测试的记录器配置外,无需进行任何修改。
使用SLF4J测试时,断言非常严格,并检查整个事件的相等性。在这种情况下,自定义匹配器可能很有趣:
public static Matcher<LoggingEvent> errorMessageContains(final String s) {
return new TypeSafeMatcher<LoggingEvent>() {
@Override
public void describeTo(final Description description) {
description.appendText(" type " + Level.ERROR + " should contain ")
.appendValue(s);
}
@Override
protected void describeMismatchSafely(final LoggingEvent item, final Description mismatchDescription) {
mismatchDescription.appendText(" was type ").appendValue(l)
.appendText(" message ").appendValue(item.getMessage());
}
@Override
protected boolean matchesSafely(final LoggingEvent item) {
return item.getLevel().equals(Level.ERROR)
&& item.getMessage().contains(s);
}
};
}
这仅检查消息是否包含文本,但如果它相等,则不检查。因此,当修改消息以修复拼写错误或提供更多详细信息时,如果仍然包含基本部分,则测试不会中断。