测试错误 - NoClassDefFoundError:解析失败:Lorg/hamcrest/Matchers

Posted

技术标签:

【中文标题】测试错误 - NoClassDefFoundError:解析失败:Lorg/hamcrest/Matchers【英文标题】:Test Error - NoClassDefFoundError: Failed resolution of: Lorg/hamcrest/Matchers 【发布时间】:2021-06-29 01:47:35 【问题描述】:

我正在使用 Espresso 进行仪器测试,但在堆栈跟踪中出现此错误:

由于缺少类导致的错误如下所示:

Caused by: java.lang.ClassNotFoundException: Didn't find class "org.hamcrest.Matchers" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~vnZzxGNKnS4V6YkEf4falA==/com.example.android.architecture.blueprints.reactive.test-K_x0_yJ0hJeDHaJkDmHXRw==/base.apk", zip file "/data/app/~~oeYx2MgTcILbk-vq_WPx1A==/com.example.android.architecture.blueprints.reactive-0wMHYEe95hx_1cnbdAoZAw==/base.apk"],nativeLibraryDirectories

它是在我在片段测试中添加这段代码后立即发生的:

这些是我在 Gradle 上的相关库:

我有这些进口:

import androidx.fragment.app.testing.launchFragmentInContainer
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.core.IsNot.not

【问题讨论】:

我很确定 espresso-core 依赖项包括 hamcrest 匹配器,您不需要单独声明 hamcrest 嗨@agoff,如果我告诉你错误是由espresso-contrib 引起的,你不会相信的。我删除了它,该项目现在运行良好。 espresso-core 包括 hamcrest 匹配器也是对的。非常感谢您调查我的问题。 【参考方案1】:

TLDR 答案,您无需降级整个 ​​espresso 设置 Hamcrest 版本与传递依赖存在冲突,可以轻松解决:

如果您正在使用:

androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'

//change it to:
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'

如果您正在使用:

androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.4.0'

//change it to:
androidTestImplementation "androidx.test.espresso:espresso-accessibility:3.3.0"

您应该仍然能够将 espresso 核心保持在更高的 3.4.0 版本


如果你想明白,这里有更长的解释:

要查看幕后发生的事情,我们可以在 android studio 终端中使用依赖项 gradle 任务打印出依赖关系树:

./gradlew :app:dependencies

我们可以运行两次,使用两个版本级别的依赖关系,可以检查差异。

在某些情况下,请求 hamcrest 库 1.3 版与大多数常见的 android 依赖项匹配。 在左侧(v3.3.0 的依赖关系树)每个 hamcrest 传递依赖项都按要求提供,毫无疑问它可以工作! 在右侧(v3.4.0 的依赖关系树),我们可以看到一些请求在更高版本中“替换”了 hamcrest 库,在这种情况下,它不起作用。

[

【讨论】:

哇,感谢您对此进行深入研究,这对帮助社区大有帮助。 @Tonnie 不用担心,如果我们了解潜在问题,我相信这些知识稍后会派上用场;)在这种情况下,“操作方法”可能会帮助其他人其他一些传递依赖问题 将依赖项更新到 3.5.0-alpha03 似乎可以解决问题 @Goldorak84 - 将 androidx.test.espresso:espresso-contrib 更新为 3.5.0-alpha03 并没有解决我的问题。【参考方案2】:

挣扎了一段时间后,我意识到错误是由espresso-contibespresso-accessibility 依赖引起的。我的浓缩咖啡版本是最新的版本 3.4.0-alpha05

我删除了它们并通过了测试。

之前包括espresso-contrib & espresso-accessibility

/*core contains matches and view assertions, included by default on android project*/
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"

//testing code for advanced views such as recyclerview and Date picker
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$espressoVersion"

之后评论espresso-contribespresso-accessibility

//core contains matches and view assertions, included by default on android project
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
//testing code for advanced views such as recyclerview and Date picker
//androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
//androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$espressoVersion"

【讨论】:

为了测试 RecyclerView 等我降级到espressoVersion = '3.3.0' 谢谢,这行得通。不知道为什么会这样,因为它基于 google 文档来添加这些依赖项。 我好像用androidTestImplementation "org.hamcrest:hamcrest:2.2"解决了这个问题

以上是关于测试错误 - NoClassDefFoundError:解析失败:Lorg/hamcrest/Matchers的主要内容,如果未能解决你的问题,请参考以下文章

python错误处理/调试/单元测试/文档测试

Laravel 单元测试显示完全错误

笑话:错误:您的测试套件必须包含至少一个测试

Android Studio Espresso 测试错误:空测试套件

数据库基准测试中应该避免的错误

测试方法不确定:未运行测试。错误?