如何让Powermock与Dexmaker合作

时间:2015-01-14 22:02:10

标签: java android mockito powermock dexmaker

我正在尝试使用以下build.gradle配置将Powermock作为Android测试的依赖项:

dependencies{
    compile 'com.android.support:appcompat-v7:21.0.+'
    androidTestCompile('org.mockito:mockito-core:1.9.5')
    androidTestCompile('com.google.dexmaker:dexmaker:1.2')
    androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2')
    androidTestCompile('org.powermock:powermock-module-junit4:1.5.5') {
        exclude module: 'junit'
    }
    androidTestCompile('org.powermock:powermock-api-mockito:1.5.5') {
        exclude module: 'mockito-all'
    }
}

然而,编译器抱怨

Error:Gradle: Execution failed for task ':app:packageDebugTest'.
> Duplicate files copied in APK mockito-extensions/org.mockito.plugins.MockMaker
    File 1: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar
    File 2: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar

查看jar结构,我注意到Dexmaker和Powermock在MockMaker中声明mockito-extensions

img

什么是MockMaker?他们有什么不同? 最重要的问题是:是否有可能让Powermock与Dexmaker很好地合作?

提前致谢。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:10)

MockMaker是一个胶水模块,它将dexmaker与Mockito集成在一起。它为Mockito创建了使用Dalvik .dex文件而不是JVM .class文件生成具体类所必需的。

Powermock可能会与Dexmaker合作,但它不太可能使用高级Powermock功能。特别是,Powermock advertises this

  

PowerMock使用自定义类加载器和字节码操作来模拟静态方法,构造函数,最终类和方法,私有方法,删除静态初始化器等等。

自定义类加载器不太可能在dalvikvm上运行。

答案 1 :(得分:3)

你可以尝试将它放在你的build.gradle中,它解决了我同样的问题

android{
...

packagingOptions{
    exclude 'mockito-extensions/org.mockito.plugins.MockMaker'
}

...

}

答案 2 :(得分:1)

我遇到了同样的问题,我刚刚找到了解决方案here。它涉及一些手动工作,你必须自己修改jar文件。

所以nparihar建议的是以下内容。

  1. 制作powermock-api-mockito-1.5.5.jar
  2. 的备份副本
  3. 将powermock-api-mockito-1.5.5.jar重命名为powermock-api-mockito-1.5.5.zip
  4. 解压缩powermock-api-mockito-1.5.5.zip
  5. cd powermock-api-mockito-1.5.5 /
  6. rm -rf mockito-extensions
  7. jar cf powermock-api-mockito-1.5.5.jar META-INF / org /
  8. 将新jar放入你的libs foler。
  9. 这个解决方案对我有用。如果它也适合你,请告诉我。

    此外,我可以看到我们使用相同的依赖项。在我的情况下,我必须手动删除hamcrest.jar和objenesis.jar,因为有混乱。

    希望有所帮助。