我正在使用Android Studio和Gradle(采用Kotlin DSL)编写一个Android应用。我的目标是集成SLF4J,并将应用程序及第三方库的所有日志在Android运行时重定向到logcat,而在本地运行时(即常规单元测试中)则重定向到控制台或文件。目前,我尝试使用的依赖项如下:
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(Java Util Logging)的日志能通过SLF4J被重定向,理论上在设备上应使用Android的logcat输出,在测试环境中则使用简单控制台输出。但问题在于,当运行测试时,两个依赖都会被包含进来,导致出现以下异常信息:
*** Caught exception: Method isLoggable in android.util.Log not mocked.
详情请见 https://developer.android.com/r/studio-ui/build/not-mocked
这意味着runtimeOnly
的依赖在执行测试时也被包含了进来。我需要在普通的单元测试中排除slf4j-android
依赖。
我的build.gradle.kts
文件使用的是Android插件,而非java插件:
plugins {
id("com.android.application")
}
这是一个标准的Android配置,意味着针对java插件的解决方案可能不适用。Android项目有三类源码:main用于实际代码,test用于本地单元测试,androidTest用于在模拟器上运行的单元测试。我希望在main和androidTest中使用Android实现,而在test中使用简单的实现。
我参考了这个类似的问题,但仍未找到解决方案。同时,也查看了另一个相关问题关于如何在Android中使用logback。
理想情况下,我希望能学习如何在build.gradle.kts
中为每个配置正确地包含依赖项,正如上述描述那样。然而,如果存在其他方案,能让SLF4J根据环境自动配置为在设备上使用logcat、在测试时使用控制台或文件输出,那也是可行的。
是否有解决这一问题的方法?乍看之下,这似乎是一个常见的需求,因为许多Android应用都需要集成Java库并重定向它们的日志,但似乎并没有现成的简便解决方案。