如何测试SpringBoot应用程序的日志?
我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它从一个 Spring Boot 应用程序开始。我正在编写集成测试,并且需要对日志进行断言?
例如,我需要断言 Camel 路由从源 A 读取消息。如何对日志进行可靠断言?是否有任何行业标准?
注意:我尝试找到任何解决方案,但目前,我既不明白如何解决它,也找不到现成的解决方案。
更新 1:我低估的细节,但它似乎很重要。我用Kotlin,不是Java。我尝试应用answer,但它不能一对一地转移到Kotlin.
更新 2:
这是从Java到的转换Kotlin。ListAppender没有足够的信息来解析 中的类型Kotlin。
class LoggerExtension : BeforeEachCallback, AfterEachCallback {
private val listAppender: ListAppender<ILoggingEvent> = ListAppender<ILoggingEvent>()
private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger
override fun afterEach(extensionContext: ExtensionContext) {
listAppender.stop()
listAppender.list.clear()
logger.detachAppender(listAppender)
}
override fun beforeEach(extensionContext: ExtensionContext) {
logger.addAppender(listAppender)
listAppender.start()
}
val messages: List<String>
get() = listAppender.list.stream().map { e -> e.getMessage() }.collect(Collectors.toList())
val formattedMessages: List<String>
get() = listAppender.list.stream().map { e -> e.getFormattedMessage() }.collect(Collectors.toList())
}
Kotlin:没有足够的信息来推断类型变量 A
不是错误,但我感觉它会在运行时失败:
私有 val 记录器:记录器 = LoggerFactory.getLogger(ROOT_LOGGER_NAME) 作为记录器
回答
Spring Boot 带有适用于 JUnit 4 的OutputCapture规则和适用于 JUnit 5 的OutputCaptureExtension,允许您对发送到标准输出的文本进行断言。
public class MyTest {
@Rule
public OutputCaptureRule output = new OutputCaptureRule();
@Test
public void test() {
// test code
assertThat(output).contains("ok");
}
}