gpt4 book ai didi

android - 如何将 Timber 日志重定向到 Junit logcat

转载 作者:行者123 更新时间:2023-12-02 13:31:47 28 4
gpt4 key购买 nike

我正在使用带有 DebugTree 的 Timber和 ProductionTree .正在运行的应用程序中一切都很好。
我还成功地在我的 JUnit 测试实现中使用了 Timber,这很好(没有真正的好处,但它确实有效)。

但是,我想获取 code under test 上的日志。显示在 JUnit 日志中。

我试图建立一个 JUnitTree并将原木重定向至 println(…) , 并设置木材 JUnitTree@Before功能,但没有任何效果。社区有什么解决办法吗?

我的请求没有任何意义吗,我在网络上没有找到任何有关此需求的信息(也许我使用了错误的关键字)。

最佳答案

以下ConsoleTree类可用于将 Timber 日志转发到标准输出:

class ConsoleTree : Timber.DebugTree() {

@Language("RegExp")
private val anonymousClassPattern = Pattern.compile("""(\$\d+)+$""")

private val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")

override fun log(priority: Int, tag: String?, message: String, throwable: Throwable?) {
val dateTime = LocalDateTime.now().formatWith(dateTimeFormatter)
val priorityChar = when (priority) {
Log.VERBOSE -> 'V'
Log.DEBUG -> 'D'
Log.INFO -> 'I'
Log.WARN -> 'W'
Log.ERROR -> 'E'
Log.ASSERT -> 'A'
else -> '?'
}

println("$dateTime $priorityChar/$tag: $message")
}

override fun createStackElementTag(element: StackTraceElement): String? {
val matcher = anonymousClassPattern.matcher(element.className)
val tag = when {
matcher.find() -> matcher.replaceAll("")
else -> element.className
}
return tag.substringAfterLast('.')
}
}

对于 JUnit 4,可以使用规则来种植和根除 ConsoleTree自动为每个测试:

class TimberConsoleRule : TestRule {
override fun apply(base: Statement, description: Description) =
TimberConsoleStatement(base)
}

class TimberConsoleStatement constructor(private val baseStatement: Statement) : Statement() {

private val consoleTree = ConsoleTree()

override fun evaluate() {
Timber.plant(consoleTree)
try {
baseStatement.evaluate()
} finally {
Timber.uproot(consoleTree)
}
}
}

对于 JUnit 5,您可以简单地使用以下 @TimberConsoleLog 注释 JUnit 测试注解:

@ExtendWith(TimberConsoleExtension::class)
@Retention(RUNTIME)
annotation class TimberConsoleLog

class TimberConsoleExtension : BeforeAllCallback, AfterAllCallback {

private val consoleTree = ConsoleTree()

override fun beforeAll(context: ExtensionContext) =
Timber.plant(consoleTree)

override fun afterAll(context: ExtensionContext) =
Timber.uproot(consoleTree)
}

关于android - 如何将 Timber 日志重定向到 Junit logcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60789445/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com