使SLF4J在Android中登录Logcat并在测试中登录到控制台(gradle依赖问题)

问题描述 投票:0回答:2

我正在 Android Studio 中使用 gradle (Kotlin DSL) 进行构建,编写一个 Android 应用程序。我的目标是使用 SLF4J 并将所有日志从应用程序和第三方库重定向到 logcat(在 Android 中运行时),但在本地运行时(即在常规单元测试中)重定向到控制台或文件。我当前的最佳尝试使用这些依赖项:

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 日志被重定向到 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.

换句话说,测试运行时仅包含运行时依赖项。不知何故,我需要在常规单元测试中摆脱 slf4j-android 依赖。

build.gradle.kts文件使用Android插件,而不是java插件:

plugins {
  id("com.android.application")
}

这是一个普通的 Android 配置,但意味着针对 java 插件的解决方案可能无法工作。 Android 有三组源:main 用于真实代码,test 用于本地单元测试,androidTest 用于在模拟设备上运行的单元测试。我需要 main 和 androidTest 中的 android 实现,但 test 中需要简单的实现。

参见 测试与编译的 Gradle 依赖不同,它类似,但仍然缺乏解决方案。编辑:另请参阅如何在 android 中使用 logback?.

理想情况下,我想了解如何为每个配置包含正确的依赖项,如上面在 build.gradle.kts 中所述。但是,如果有另一种解决方案,可以将 SLF4J 配置为在设备上使用 logcat,并且测试中的控制台或文件也可以工作。

有办法做到这一点吗?乍一看这应该是很常见的事情,因为许多 Android 应用程序需要包含 Java 库并重定向其日志,但显然不是。

java android gradle android-gradle-plugin slf4j
2个回答
0
投票

如果您可以迁移到 slf4j v2.0.9+,您可以安全地使用

slf4j.provider
系统属性来指示您要使用哪个提供程序(参考 here)。

自 2.0.9 起 您可以通过“slf4j.provider”系统属性显式指定提供程序类。这绕过了寻找提供者的服务加载器机制,并可能缩短 SLF4J 初始化时间。

例如,您可以像下面这样定义来告诉 slf4j 委托给 slf4j-simple 绑定:

-Dslf4j.provider=org.slf4j.simple.SimpleServiceProvider

警告

1.8.0-alpha0(最终由slf4j更名为v2.0)以来,slf4j-android模块已被删除。

由于缺乏兴趣,slf4j-android 和 slf4j-jcl 模块已被删除且没有替代。

找到这个存储库与 slf4j 2.x 兼容的版本,这可能是 v2 迁移的一个良好的开始。


0
投票

实际上可以在测试配置中摆脱Android依赖。语法如下。

dependencies {
  implementation("org.slf4j:slf4j-api:1.7.36")
  runtimeOnly("org.slf4j:jul-to-slf4j:1.7.36")
  runtimeOnly("org.slf4j:slf4j-android:1.7.36")
  testImplementation("org.slf4j:slf4j-simple:1.7.36")
}

configurations.testImplementation {
  // Don't include two SLF4J implementations in unit tests
  // Remove the logcat version, which doesn't work
  exclude("org.slf4j", "slf4j-android")
}

这包括 main 和 androidTest 中的 slf4j-android,但将其从使用 slf4j-simple 的测试中删除。这里我包括了 jul-to-slf4j,因为我们正在使用它,但它不是解决方案的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.