F1s*_*her 6 java android gradle android-espresso android-recyclerview
最近我需要测试RecyclerView,我在使用它时遇到了很多麻烦.
首先,我通过向我们提供位于espresso-contrib中的 RecyclerViewActions来了解Espresso已经"支持"RecyclerViews .所以我决定使用它,我的依赖关系看起来像这样:
dependencies {
androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.squareup.spoon:spoon-client:1.2.1'
androidTestCompile 'com.jraska:falcon-spoon-compat:0.3.1'
androidTestCompile 'com.android.support:support-annotations:23.1.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
androidTestCompile "org.mockito:mockito-core:1.10.19"
androidTestCompile "com.google.dexmaker:dexmaker:1.2"
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2"
}
Run Code Online (Sandbox Code Playgroud)
但是,只有在尝试将espresso-core改为espresso-contrib后才尝试运行我的测试.我可以看到这个错误:
Test running failed: Instrumentation run failed due to 'java.lang.IncompatibleClassChangeError'
Run Code Online (Sandbox Code Playgroud)
我试着把它谷歌出来.我看到很多话题,人们都在回答这样的问题.所以我排除了appcompat,supportv4和recyclerview-v7.像那样:
androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
Run Code Online (Sandbox Code Playgroud)
测试开始但是......我不能使用任何RecyclerViewActions.因为在排除了recyclerview-v7后没有任何方法,我在网上看到的几乎所有地方都推荐使用.当我尝试使用 - RecyclerViewActions.actionOnItemAtPosition - 我的核心方法时,我收到此错误:
java.lang.NoSuchMethodError: No virtual method findViewHolderForPosition(I)Landroid/support/v7/widget/RecyclerView$ViewHolder; in class Landroid/support/v7/widget/RecyclerView; or its super classes (declaration of 'android.support.v7.widget.RecyclerView' appears in /data/app/com.myapp.debug1-1/base.apk)
at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:288)
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Run Code Online (Sandbox Code Playgroud)
所以我宁愿使用这个recyclerview-v7而不是排除它.我将espresso-contrib导入修改为:
androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
}
Run Code Online (Sandbox Code Playgroud)
测试运行但是...我在测试过程中遇到错误:
android.view.InflateException: Binary XML file line #36: Error inflating class android.support.design.widget.NavigationView
Run Code Online (Sandbox Code Playgroud)
所以我在我的gradle中使用最新的库:
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:support-v13:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
Run Code Online (Sandbox Code Playgroud)
NavigationView正在使用最新的RecyclerView 23.1.1.我试着找出错误所以我通过在控制台中使用./gradlew app:dependencies来显示espresso-contrib的依赖关系,我可以看到:
+--- com.android.support.test.espresso:espresso-contrib:2.2.1
| +--- com.android.support.test.espresso:espresso-core:2.2.1
| | +--- com.squareup:javawriter:2.1.1
| | +--- com.android.support.test:runner:0.4.1 (*)
| | +--- com.android.support.test:rules:0.4.1 (*)
| | +--- javax.inject:javax.inject:1
| | +--- org.hamcrest:hamcrest-library:1.3
| | | \--- org.hamcrest:hamcrest-core:1.3
| | +--- org.hamcrest:hamcrest-integration:1.3
| | | \--- org.hamcrest:hamcrest-library:1.3 (*)
| | +--- com.google.code.findbugs:jsr305:2.0.1
| | +--- javax.annotation:javax.annotation-api:1.2
| | \--- com.android.support.test.espresso:espresso-idling-resource:2.2.1
| +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0
| | \--- org.hamcrest:hamcrest-core:1.3
| \--- com.android.support:recyclerview-v7:23.0.1
| \--- com.android.support:support-annotations:23.0.1 -> 23.1.1
Run Code Online (Sandbox Code Playgroud)
好吧所以最近使用的espresso-contrib-2.2.1是使用com.android.support:recyclerview-v7:23.0.1 - 而不是最新版本的recyclerView,它导致错误.我决定通过添加以下内容在espresso-contrib内更新它:
androidTestCompile 'com.android.support:recyclerview-v7:23.1.1'
Run Code Online (Sandbox Code Playgroud)
我再次使用app:dependencies,我可以看到变化:
\--- com.android.support:recyclerview-v7:23.0.1 -> 23.1.1 (*)
Run Code Online (Sandbox Code Playgroud)
我再次开始测试.而且我不再使用NavigationView出错 - 我认为它已经解决了但是......出现了另一个错误:
android.view.InflateException: Binary XML file line #21: Error inflating class android.support.v7.widget.Toolbar
Run Code Online (Sandbox Code Playgroud)
现在我有点想法了.当你看到espresso-contrib的依赖关系时,我认为它没有使用任何可能使用工具栏的东西.工具栏是appcompat-v7的一部分,所以我尝试添加它的方式与我将recyclerView升级到最新版本的方式相同.所以我补充说:
androidTestCompile 'com.android.support:appcompat-v7:23.1.1'
Run Code Online (Sandbox Code Playgroud)
但它对我没有帮助.而且我被困住了.
你有没有遇到这些问题?您有解决方法如何点击recyclerView吗?如何检查recyclerView中的项目是否有文本或类似的东西?我在网上找到的所有解决方案都使用方法:findViewHolderForPosition,我不能在排除recyclerview-v7模块后使用.喜欢 :
要么
https://gist.github.com/chemouna/00b10369eb1d5b00401b
或者更多.
工具栏的问题是由以下事实引起的:我在 app.gradle 文件中使用的一些库没有最新的 RecyclerView,因此我还需要添加:
compile 'com.android.support:appcompat-v7:23.1.1'
Run Code Online (Sandbox Code Playgroud)
java.lang.NoSuchMethodError 的问题就在我这边。ProGuard 配置删除了一些方法。
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |