仪表化测试将无法运行——在路径“META-INF/LICENSE.md”中找到 6 个文件

sam*_*234 7 android gradle kotlin android-testing build.gradle

编辑:发现 MockK 导致了这个问题。我猜当我模拟 API 请求时,它会复制这些文件。当我删除 MockK 和/或 Mockito 时。我没有收到这些错误。有任何想法吗?

收到此错误,表明存在这些重复的元数据文件。我尝试在 build.gradle 文件中添加打包选项块以排除这些文件,但随后我的测试根本无法运行。有没有办法手动删除重复项?这些文件将位于哪里?任何帮助是极大的赞赏。我迷路了哈哈。

测试:

    @RunWith(AndroidJUnit4::class)
    class ViewModelTests {
    
        @get:Rule(order = 1)
        val testRule = ActivityScenarioRule(MainActivity::class.java)
    
        private lateinit var viewModel: NewsViewModel
        private lateinit var repositoryImpl: RepositoryImpl
        private val context = InstrumentationRegistry.getInstrumentation().targetContext
    
        @Before
        fun setUp() {
            val newsDao = NewsDatabase.getDatabase(context).myDao()
            val newsApi = mockk<NewsApi>()
            viewModel = mockk()
            repositoryImpl = RepositoryImpl(newsApi, newsDao)
        }
    
        @Test
        fun test_empty_database() = runBlocking {
            assertEquals(0, repositoryImpl.getNewsFromDatabase.value?.size)
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误:任务“:app:mergeDebugAndroidTestJavaResource”执行失败。

执行 com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 时发生故障 从输入中找到路径“META-INF/LICENSE.md”的 6 个文件: - /Users/sammorton/.gradle/caches/modules-2/文件-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeaf92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar - /Users/sammorton/.gradle/caches/modules-2/files- 2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar-/Users/sammorton/.gradle/caches/modules-2/files-2.1/ org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar - /Users/sammorton/.gradle/caches/modules-2/files-2.1/org. junit.platform/junit-platform-engine/1.8.2/b737de09f19864bd136805c84df7999a142fec29/junit-platform-engine-1.8.2.jar - /Users/sammorton/.gradle/caches/modules-2/files-2.1/org.junit。平台/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar - /Users/sammorton/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/ junit-jupiter/5.8.2/5a817b1e63f1217e5c586090c45e681281f097ad/junit-jupiter-5.8.2.jar 添加packageOptions块可能会有所帮助,请参阅 https://developer.android.com/reference/tools/gradle-api/7.3/com /android/build/api/dsl/ResourcesPackagingOptions 了解更多信息

Iva*_*sov 15

对于遇到此问题的其他人,按照错误输出的建议,修复方法是使用适当的packagingpackagingOptions对于较旧的 AGP 版本)块:

packaging {
    resources.excludes.addAll(
        listOf(
            "META-INF/LICENSE.md",
            "META-INF/LICENSE-notice.md",
            ... // other conflicting META-INF bits
        )
    )
}
Run Code Online (Sandbox Code Playgroud)

致谢赫伯特74


小智 5

您可以在 ResourcePackingOptions 中选择 pickFirsts、合并和排除。根据许可证的不同,您可能无法排除它们。

https://developer.android.com/reference/tools/gradle-api/8.0/com/android/build/api/dsl/ResourcesPackagingOptions

Android Studio 项目默认排除不需要它的许可证(AL2 和 LGPL2)。对于其余的,将它们合并在一起是一个合理的方法 -

packagingOptions {
    resources {
        excludes += "/META-INF/{AL2.0,LGPL2.1}"
        merges += "META-INF/LICENSE.md"
        merges += "META-INF/LICENSE-notice.md"
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,摆脱androidTestImplementationMockK 库解决了我的问题。androidTestImplementation如果您在 Android 测试中没有使用MockK 或 Mockito,请删除这些依赖项并再次运行您的代码。当我尝试运行我的撰写测试时,我遇到了这个错误