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

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

编辑:发现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)
        }
    }

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

执行com.android.build.gradle.internal.tasks.MergeJavaResWorkAction时发生故障 从输入中找到路径“META-INF/LICENSE.md”的 6 个文件: - /Users/sammorton/.gradle/caches/modules-2/files-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.platform/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 添加 PackagingOptions 块可能会有所帮助,请参阅 https://developer.android.com/reference/tools/gradle-api/7.3/com/android/build/api/dsl/ResourcesPackagingOptions 了解更多信息

android kotlin gradle build.gradle android-testing
4个回答
17
投票

对于遇到此问题的其他人,按照错误输出的建议,修复方法是使用适当的

packaging
packagingOptions
对于较旧的 AGP 版本)块:

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

致谢herrbert74


13
投票

您可以在 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"
    }
}

5
投票

对我来说,摆脱 MockK 库的

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


0
投票

下面的代码对我有用

android { packagingOptions { resources.excludes.add("META-INF/*") } }
© www.soinside.com 2019 - 2024. All rights reserved.