如何测试 Spring 启动应用程序的日志?
How can I test logs of Spring Boot application?
我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它作为 Spring 启动应用程序启动。我在写集成测试,我需要在日志上做断言?
例如,我需要断言 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: Not enough information to infer type variable A
不是错误,但我感觉它会在运行时失败:
private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger
Spring Boot 附带了 JUnit 5 的 OutputCapture rule for JUnit 4 and OutputCaptureExtension,让您可以断言发送到标准输出的文本。
public class MyTest {
@Rule
public OutputCaptureRule output = new OutputCaptureRule();
@Test
public void test() {
// test code
assertThat(output).contains("ok");
}
}
我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它作为 Spring 启动应用程序启动。我在写集成测试,我需要在日志上做断言?
例如,我需要断言 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: Not enough information to infer type variable A
不是错误,但我感觉它会在运行时失败:
private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger
Spring Boot 附带了 JUnit 5 的 OutputCapture rule for JUnit 4 and OutputCaptureExtension,让您可以断言发送到标准输出的文本。
public class MyTest {
@Rule
public OutputCaptureRule output = new OutputCaptureRule();
@Test
public void test() {
// test code
assertThat(output).contains("ok");
}
}