安卓仪表盘测试:IllegalAccessError

4

在运行Android测试时,我遇到了IllegalAccessError错误。
以下是Logcat输出:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

这是我的设置:
TestProject测试UnderTestProject,其中在“项目”选项卡中包括AnotherProject的构建路径,并从“排序和导出”选项卡中导出它。被测试的类属于AnotherProject
我遵循了这个stackoverflow问题中关于配置构建路径的建议。
使用Maven从命令行进行构建。AnotherProjectTestProjectUnderTestProject的pom文件中作为依赖项。这是否是仍然出现错误的原因?我该如何解决?只为UnderTestProject在pom中包含AnotherProject,并将UnderTestProject包含在TestProject的pom中?
Eclipse的构建路径如何与Maven的pom相结合?
我对此不是很清楚,非常感谢任何帮助。
谢谢!
我尝试了以下方法,但仍然出现问题:
  1. TestProject的pom中删除AnotherProject,并将UnderTestProject添加到其中。
  2. 按照此线程的建议。如果为AnotherProject添加<scope>provided</scope>,则我的UnderTestProject甚至无法构建。
我现在陷入了困境,请让我知道您是否有出路。
谢谢!
3个回答

1
我遇到了同样的问题。为了解决这个问题,我不得不将主应用程序的pom.xml中的库依赖项添加到测试应用程序的pom.xml中,但是对它们添加了 <scope>provided</scope>
因此,如果我在MyApp pom.xml中有以下依赖项:
<dependency>
    <groupId>com.nineoldandroids</groupId>
    <artifactId>library</artifactId>
    <version>2.4.0</version>
</dependency>

我必须将以下代码添加到MyAppTest的pom.xml文件中:

<dependency>
    <groupId>com.nineoldandroids</groupId>
    <artifactId>library</artifactId>
    <version>2.4.0</version>
    <scope>provided</scope>
</dependency>

1

首先,请按照android-maven-plugin维基页面上的Libraries部分这里进行操作:

如果您的项目设置包含库,则这些库也需要添加为<scope>provided</scope>,否则它们将被添加到测试中,这将导致错误“预验证类中的类引用解析为意外实现”的重复。

... ...

请注意Bug#142,目前仅具有<packaging>jar</packaging>的库才能正常工作。

然后右键单击您的UnderTestProject,单击Build Path -> Configure Build Path,在Order and Export选项卡中选中Maven Dependencies:enter image description here

这对我很有效,希望对您有所帮助。


谢谢你的回答!我现在已经转到了Robolectric,并成功运行了测试。但是我还需要进行仪器测试,等我再次达到测试环节后,我将验证这一点。在那之前,我会接受你的回答。 - Chaitanya

0

您没有说明这是否仅限于Eclipse的问题,还是使用Maven构建项目也会失败(使用android-maven-plugin)。在我的情况下,两者都会失败。原因是来自UnderTestProject.apk的传递依赖项也会进入TestProject.apk,导致pre-verified类问题。对我而言,解决方案是在TestProject的pom中应用以下内容:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>UnderTestProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <type>apk</type>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用通配符的方式,如这里所讨论的那样,会产生一个警告,但可以完美地完成工作(在Maven 3.1.1上测试过)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接