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

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

但是,我希望将code under test上的日志显示在junit日志中。

我试图建立一个JunitTree并将木材lofs重定向到println(....),并在@before函数中设置Timber JunitTree ...但是没有任何效果。社区有什么解决方案吗?

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

0
投票

对于JUnit 5,可以使用以下@TimberConsoleLog注释来注释JUnit测试:

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

class TimberConsoleExtension : BeforeAllCallback {

    override fun beforeAll(context: ExtensionContext?) =
        Timber.plant(ConsoleTree())
}

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('.')
    }
}