我正在Android Studio中使用Gradle(Kotlin DSL)编写一个Android应用程序.我的目标是使用SLF4J,并在Android中运行时将应用程序和第三方库中的所有日志(log)重定向到Logcat,但在本地运行时(即在常规单元测试中)重定向到控制台或文件.我目前的最佳try 是使用以下依赖项:
dependencies {
implementation("org.slf4j:slf4j-api:1.7.36")
implementation("org.slf4j:jul-to-slf4j:1.7.36")
runtimeOnly("org.slf4j:slf4j-android:1.7.36")
testRuntimeOnly("org.slf4j:slf4j-simple:1.7.36")
}
库中的JUL日志(log)被重定向到SLF4J,它应该使用设备上的Android logcat输出,但在测试中使用简单的控制台输出.不幸的是,我在运行测试时得到了这两个依赖项,结果是:
*** Caught exception: Method isLoggable in android.util.Log not mocked.
See https://developer.android.com/r/studio-ui/build/not-mocked for details.
换句话说,当测试运行时,只包含runtime Only依赖项.以某种方式,我需要在常规单元测试中消除slf4j-android依赖.
Build.gradle.kts文件使用Android插件,而不是Java插件:
plugins {
id("com.android.application")
}
这是一个现成的Android配置,但这意味着针对Java插件的解决方案可能不起作用.Android有三组源代码:用于真实代码的main、用于本地单元测试的测试和用于在模拟设备上运行的单元测试的androidTest.我需要在Main和androidTest中的Android实现,但测试中的简单实现.
见Different Gradle dependency for test than for compile,与之类似,但仍缺乏解决方案.编辑:另请参阅How to use logback in android?.
理想情况下,我希望了解如何在Build.gradle.kts中为上述每个配置包含正确的依赖项.然而,如果有另一个解决方案,其中SLF4J可以配置为在设备上使用LogCAT,并且在测试中使用控制台或文件,那么也可以工作.
有办法做到这一点吗?乍一看,这应该是一个常见的事情,因为许多Android应用程序需要包括Java库和重定向其日志(log),但显然不是.