2015-01-15 37 views
1

我想在我的单元测试(JUnit 4.12)中使用PowerMock。PowerMock + Mockito + Maven Android应用程序显示Dex加载器错误

我已经有了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依赖项(以及所有使用它的单元测试)时,项目现在可以在我的设备上运行而没有问题。

EDIT 2

用命令mvn dependency:list的帮助中的评论所说,我已经发现了这一点:

  • 的JUnit对org.hamcrest的依赖:hamcrest核心: jar:1.3:test
  • PowerMock还对hamcrest库有依赖关系

看来问题只有在项目中使用的库的最新版本时才会发生。我试图删除JUnit的依赖,只使用powermock和启动时的错误是一样的。所以我不认为这是一个“碰撞”问题,但可能与hammrest版本与powermock的问题?而且我不知道为什么它的使用在发射,因为它是在“测试”范围......

编辑3 我从与Maven从头开始创建一个Android项目,看它是否与我的主要应用程序的问题或与Maven合作。问题似乎在Maven或PowerMock依赖中。如果你想尝试,here is the complete java project。在这个项目中没有单元测试,我只想在我的Android机器上运行它。我仍然收到完全相同的讯息。

+0

这是器乐或robolectric测试? –

+0

如果您在控制台'mvn -o dependency:list \ |运行控制台,您是否看到harmcrest重复的依赖项? grep“:。*:。*:。*”\ | cut -d] -f2- \ | sed's /:[a-z] * $ // g'\ |排序-u' –

+0

这是一个Android应用程序。我使用单元测试(在Windows机器上)。当我运行该应用程序时,它运行在Android设备上。所以我想这不是仪器或roblectric测试(不知道这是什么) –

回答

1

我终于解决了这个问题,但我不明白一切。非常感谢Eugen Martynov对他的帮助,对this post给了我很大的指导。

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

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

问题的其余部分只是删除重复Hamcrest依赖项,只有一个在我的项目中。解决这个问题后,第二个库存在“发育”相同的问题。我做了同样的修复,终于奏效了。

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> 
+0

好,你解决了它。两条评论:maven没有嵌套的依赖关系的问题,它只是对重复的依赖关系严格的android构建;我鼓励你学习和使用Gradle(和Android Studio),因为它受谷歌支持,maven不是(并且eclipse也不会很快) –

+0

谢谢!很快就会看到这个! –

相关问题