8

我正在尝试使用以下 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 都声明了一个MockMakerinmockito-extensions

图像

什么是 MockMaker?它们有何不同?还有最重要的问题:Powermock 能否与 Dexmaker 很好地协同工作?

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

4

3 回答 3

10

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

Powermock 可能会与 Dexmaker 一起使用,但高级 Powermock 功能不太可能会起作用。特别是,Powermock宣传这一点

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

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

于 2015-01-15T03:22:27.570 回答
3

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

android{
...

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

...

}
于 2016-12-01T15:50:28.827 回答
1

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

所以nparihar建议如下。

  1. 制作 powermock-api-mockito-1.5.5.jar 的备份副本
  2. 将 powermock-api-mockito-1.5.5.jar 重命名为 powermock-api-mockito-1.5.5.zip
  3. 解压powermock-api-mockito-1.5.5.zip
  4. cd powermock-api-mockito-1.5.5/
  5. rm -rf 模拟扩展
  6. jar cf powermock-api-mockito-1.5.5.jar META-INF/org/
  7. 将新 jar 放入您的 libs 文件夹中。

这个解决方案对我有用。让我知道它是否也适合您。

另外,我可以看到我们正在使用相同的依赖项。在我的情况下,我不得不手动删除 hamcrest.jar 和 objenesis.jar 因为有冲突。

希望有帮助。

于 2015-02-04T09:58:53.740 回答