我正在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),但显然不是.

推荐答案

事实上,在测试配置中可以摆脱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-androidTest,但将其从test中删除,其中使用了slf4j-Simple.在这里,我包括了我们正在使用的Jul-to-slf4j,但它不是解决方案的一部分.

Java相关问答推荐

为什么JFrame paint()多次绘制同一点(或根本不绘制)?

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

转换为Biggram

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

如何使用jooq generator将表名和列名映射为人类可读的?

Javascript在边界中心调整ImageView大小

路径映射未发生

现场观看Android Studio中的变化

内存中的H2修剪尾随空格

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

用户填充的数组列表永不结束循环

在Eclipse中数组的可空性

如何用内置Java从JavaFX应用程序中生成.exe文件?

Android应用程序为错误的显示类型 Select 尺寸文件

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

在权限列表中找不到我的应用程序

spring 更新多项管理关系

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题

双对象供应商