如何测试 Spring Boot 应用程序的日志?

Dmy*_*kyi 2 logging spring integration-testing kotlin spring-boot

我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它从一个 Spring Boot 应用程序开始。我正在编写集成测试,并且需要对日志进行断言?

例如,我需要断言 Camel 路由从源 A 读取消息。如何对日志进行可靠断言?是否有任何行业标准?

注意:我尝试找到任何解决方案,但目前,我既不明白如何解决它,也找不到现成的解决方案。

更新 1:我低估的细节,但它似乎很重要。我用Kotlin,不是Java。我尝试应用answer,但它不能一对一地转移到Kotlin.

更新 2:

这是从Java到的转换KotlinListAppender没有足够的信息来解析 中的类型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())
}
Run Code Online (Sandbox Code Playgroud)

Kotlin:没有足够的信息来推断类型变量 A

不是错误,但我感觉它会在运行时失败:

私有 val 记录器:记录器 = LoggerFactory.getLogger(ROOT_LOGGER_NAME) 作为记录器

Mac*_*iak 6

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");
     }

 }
Run Code Online (Sandbox Code Playgroud)