【问题标题】:PowerMock + Mockito + Maven on Android app showing Dex loader errorAndroid 应用程序上的 PowerMock + Mockito + Maven 显示 Dex 加载程序错误
【发布时间】:2015-01-15 20:38:38
【问题描述】:

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

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

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

当我点击 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 依赖项中。如果你想尝试,here is the complete java project。这个项目没有单元测试,我只想在我的Android机器上运行它。我仍然收到完全相同的消息。

【问题讨论】:

  • 这是仪器测试还是机器人测试?
  • 如果你在控制台运行mvn -o dependency:list \ | grep ":.*:.*:.*" \ | cut -d] -f2- \ | sed 's/:[a-z]*$//g' \ | sort -u ,你会看到harmcrest重复依赖
  • 这是一个安卓应用。我使用单元测试(在 Windows 机器上)。当我运行该应用程序时,它在安卓设备上运行。所以我猜这不是仪器或电子测试(不知道这是什么)
  • 我无法运行你的命令,我收到这条消息: grep: : Invalid request code cut: : Invalid request code sed: read error on : Invalid request code
  • 那是仪器测试,不知道你在 Windows 上。只需运行mvn dependency:list 并检查是否存在Hamcrest 依赖项

标签: android junit mockito powermock


【解决方案1】:

我终于解决了这个问题,但我不明白一切。非常感谢Eugen Martynov 的帮助,感谢this post 为我指明了正确的方向。

问题似乎是 Maven 在嵌套依赖项中的重复 .jar 文件存在一个大问题。通过使用类搜索,我发现 hamcrest 类名“Description”在我的项目中出现了 3 次!

所以我对如何在 Maven 中排除依赖项进行了一些研究,发现您可以在 Maven Pom 编辑器中完成所有这些工作。您可以单击依赖项选项卡中的依赖项并执行“删除”。

剩下的问题只是删除重复的 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>

【讨论】:

  • 很好,你解决了它。两个 cmets:maven 没有嵌套依赖的问题,只是 android build 对重复依赖是严格的;我鼓励你学习和使用 gradle(和 Android Studio),因为它受 Google 支持,maven 不支持(而且 eclipse 也不会很快)
  • 谢谢!很快就会看看这个!
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 2013-08-17
  • 2021-03-01
  • 2023-03-09
相关资源
最近更新 更多