PowerMock + Mockito + Maven on Android 应用程序显示 Dex 加载器错误



我正在尝试在我的单元测试中使用PowerMock(JUnit 4.12)。

我已经集成了 Mockito,没有任何问题。这是一个安卓应用程序。

当我运行我的单元测试时,没有问题,静态函数的模拟工作得很好。

当我单击 eclipse 中的"播放"按钮以在连接的物理机上运行我的应用程序时,我收到此错误:

[2015-01-15 15:22:22 - Dex Loader] Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;
[2015-01-15 15:22:22 - CLAP] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;

我已经读到这意味着PowerMock不支持Delvik VM,但我不明白这意味着什么,我不敢相信PowerMock团队或Mockito团队没有找到在Android环境中工作的方法!

这是我在Maven中与PowerMock和Mockito相关的依赖项

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>
       <dependency>
          <groupId>org.powermock</groupId>
          <artifactId>powermock-module-junit4</artifactId>
          <version>1.6.1</version>
          <scope>test</scope>
       </dependency>
       <dependency>
          <groupId>org.powermock</groupId>
          <artifactId>powermock-api-mockito</artifactId>
          <version>1.6.1</version>
          <scope>test</scope>
       </dependency>

有人可以帮助我吗?

编辑

我很确定我需要做的就是在实际运行应用程序(不在测试中)时从我的依赖项中删除 PowerMock,但我不知道该怎么做。我正在使用 Eclipse,所以我需要一个可以在此环境中工作的解决方案。我已经检查了Maven的配置文件和排除,但我看不到如何实现这一点。我对 maven 很陌生。任何帮助将不胜感激。

此外,当我删除 PowerMock 依赖项(以及使用它的所有单元测试)时,该项目现在可以在我的设备上运行而不会出现问题。

编辑 2

在评论中建议的命令的帮助下mvn dependency:list我发现了这一点:

  • JUnit 依赖于 org.hamcrest:hamcrest-core:jar:1.3:test
  • PowerMock也依赖于Hamcrest库。

似乎问题仅在项目中使用的库的hamcrest版本时才会发生。我试图删除 JUnit 依赖项,只使用 powermock 依赖项,启动时的错误是相同的。所以我不认为这是一个"碰撞"问题,但可能是带有 powermock 的 hamcrest 版本的问题???我想知道为什么它在发布时使用,因为它在"测试"范围内......

编辑 3我用Maven从头开始创建了一个Android项目,看看是我的主应用程序还是Maven的问题。问题似乎出在Maven或PowerMock依赖项中。如果你想尝试,这里是完整的Java项目。这个项目没有单元测试,我只想在我的安卓机器上运行它。我仍然收到完全相同的消息。

我终于解决了这个问题,但我并不了解所有内容。非常感谢Eugen Martynov的帮助和这篇文章,它为我指明了正确的方向。

问题似乎是Maven在嵌套依赖项中的重复.jar文件方面存在很大问题。通过使用类搜索,我发现Hamcrest类名"描述"在我的项目中出现了3次!

所以我做了一些关于如何在Maven中排除依赖项的研究,发现你可以在Maven Pom Editor中完成所有这些操作。您可以单击依赖项选项卡中的依赖项,然后执行"删除"。

其余的问题只是删除重复的Hamcrest依赖项,以便在我的项目中只有一个。修复此问题后,第二个库也遇到了同样的问题"obgenesis"。我做了同样的修复,它终于奏效了。

Eugen Martynov在评论中向我指出,我根本没有使用Maven。也许这是真的,请耐心等待!至少现在,我对Maven有了更多的了解,它在我的项目中做了它需要做的事情。

下面是最终的依赖项代码:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.8</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>objenesis</artifactId>
            <groupId>org.objenesis</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.1</version>
    <scope>test</scope>
    <optional>true</optional>
    <exclusions>
        <exclusion>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.1</version>
    <scope>test</scope>
    <optional>true</optional>
    <exclusions>
        <exclusion>
            <artifactId>mockito-all</artifactId>
            <groupId>org.mockito</groupId>
        </exclusion>
    </exclusions>
</dependency>

相关内容

  • 没有找到相关文章

最新更新