16

我现在正在为 Android 项目编写测试,只是不明白为什么这么痛苦!经过一整天的设置,我终于让它工作了,但是现在,在我编写了几个测试类之后 Intellij IDEA 代表:

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.IllegalAccessError''. Check device logcat for details
Test running failed: Instrumentation run failed due to 'java.lang.IllegalAccessError'

我几分钟前运行的测试无法再运行了。考虑到我回滚到最近的提交,一切都很理想,我没有更改任何设置,我只是想知道为什么。

这是logcat所说的:

02-12 20:16:09.398: E/AndroidRuntime(4922): FATAL EXCEPTION: main
02-12 20:16:09.398: E/AndroidRuntime(4922): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.view.MenuInflater$MenuState.readItem(MenuInflater.java:327)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.view.MenuInflater.parseMenu(MenuInflater.java:147)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.view.MenuInflater.inflate(MenuInflater.java:97)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at <package>.ui.CheckPasswordActivity.onCreateOptionsMenu(CheckPasswordActivity.java:130)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.support.v4.app._ActionBarSherlockTrojanHorse.onCreatePanelMenu(_ActionBarSherlockTrojanHorse.java:45)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:556)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:60)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:154)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:407)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:769)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:201)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.view.Choreographer.doFrame(Choreographer.java:531)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.os.Handler.handleCallback(Handler.java:725)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.os.Looper.loop(Looper.java:137)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at android.app.ActivityThread.main(ActivityThread.java:5039)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at java.lang.reflect.Method.invokeNative(Native Method)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at java.lang.reflect.Method.invoke(Method.java:511)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-12 20:16:09.398: E/AndroidRuntime(4922):     at dalvik.system.NativeStart.main(Native Method)

虽然我什至没有碰过这个类,但它所指的 CheckPasswordActivity line:130 只是:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.menu_check_password, menu);
        return true;
    }
4

6 回答 6

23

我终于找到了解决办法。问题确实出在依赖项上,仍然不知道为什么它曾经工作然后突然被拒绝,但这是您的测试模块的依赖项应该是什么样子:

在此处输入图像描述

因此,总而言之,您需要确保为您的测试模块列出所有库和项目库,并标记为“已提供”,但 Robotium lib 除外,即“编译”。

于 2013-02-13T07:43:47.767 回答
2

就我而言,这是由于包含了重复的罐子。

于 2013-11-06T01:52:03.390 回答
1

根据您的其他问题...我想我的设置与您有些相似...这几乎是我的依赖项的设置方式(将子项读取为依赖项)

  • 动作条夏洛克
    • 安卓支持-v4
  • 安卓模块
    • 动作条夏洛克
    • 安卓支持-v4
  • 单元测试
    • 机器人
    • 安卓模块

所有依赖项都设置为“编译”

我使用源代码中的 ActionBarSherlock 并且该模块已选中“是库项目”。

于 2013-02-12T22:00:01.910 回答
0

我只是遇到了同样的问题,因为它解决了问题,所以尝试执行以下操作。

从您的测试项目中删除 android-support-v4 库(或任何为此加倍的库)。清理项目并重新构建它。

于 2013-07-10T12:51:48.213 回答
0

添加以下行:

manifestmerger.enabled=true 

到您的应用程序项目的 project.properties 文件。

为我修复了:) 有一个带有图书馆项目的项目

于 2013-09-16T06:44:57.633 回答
0

我有一些同样的错误。当我运行测试类并且一种方法会失败时(例如检查 textview 的文本,但文本与您检查的内容不同。),而不是显示正确的通常错误,即说出通常应该说的内容,它会显示非法访问错误并且整个测试类将被停止,而不运行其他测试。

我的解决方案是读取非法访问错误并查看/google 搜索缺少哪个依赖项,然后在 build.gradle 文件的依赖项部分添加此依赖项。

例如。它向我显示了这个错误:java.lang.IllegalAccessError:非法类访问:'androidx.test.core.app.ListFuture' 试图访问'androidx.concurrent.futures.DirectExecutor'('androidx.test.core.app 的声明.ListFuture' ...等等等等。我从这篇文章和其他来源看到的内容与我的依赖关系有关,或者丢失了。

所以从我看到的错误中:......试图访问'androidx.concurrent.futures.DirectExecutor' ...... 所以我谷歌搜索了'androidx.concurrent.futures.DirectExecutor'依赖。我找到了有关“并发”依赖的官方 android 网站,所以我将该依赖(实现“androidx.concurrent:concurrent-futures:1.1.0”)添加到我的 build.gradle(模块:MyAppName.app)中,在依赖项部分,我的问题解决了!

我在这里发布这个,对于除了操作之外的其他人有“非法访问错误”,甚至对于看到这个的操作。所以阅读错误信息。某处可能会说其他缺少的方法并谷歌搜索它。我知道它有点不同的错误,但它仍然是“非法访问错误”,并且会帮助其他有类似错误的人。

于 2021-12-06T15:36:31.537 回答