【问题标题】:Android Project: Multiple dex files define Lorg/powermock/api/mockito/expectation/WithExpectedArgumentsAndroid项目:多个dex文件定义Lorg/powermock/api/mockito/expectation/WithExpectedArguments
【发布时间】:2017-07-19 11:46:03
【问题描述】:

我编写了一个小型示例 Android 应用程序,它是“开箱即用”的单个空活动应用程序。 当我尝试通过 build.gradle 添加 powermock2 时,它不会运行。 下面是我的整个 build.gradle 文件。

注意:使用 compile 是因为我们将覆盖 getSystemService(String service) 并在其中嵌入一些模拟来调整 ConnectivityManger 和 NetworkType 的返回值。

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.exampleapp"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

def powerMockVersion =  '1.7.0'

dependencies {
    repositories {
        mavenCentral()
    }

    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile ("org.powermock:powermock-module-junit4:$powerMockVersion") {
        exclude group: 'org.objenesis', module: 'objenesis'
    }

    compile ('org.powermock:powermock-api-mockito2:1.7.0') {
        exclude group: 'org.mockito', module: 'hamcrest-core'
        exclude group: 'org.hamcrest', module: 'hamcrest-core'
        exclude group: 'junit' exclude group: 'org.mockito'
        exclude group: 'org.objenesis', module: 'objenesis'
    }

//    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
//        exclude group: 'com.android.support', module: 'support-annotations'
//    })
//    testCompile 'junit:junit:4.12'
}

复制:

在你的安卓项目中,
1) 为空活动创建一个新的 Android 模块并将其命名为 exampleapp。
2) 为它编辑你的 build.gradle 文件。复制/粘贴以上内容。
3) Gradle 同步并运行它。
因 dexing 错误而失败。

Error:Execution failed for task ':exampleapp:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lorg/powermock/api/mockito/expectation/WithExpectedArguments;

作为一种解决方法,如果我使用 mockito(而不是 mockito2),dex 问题就会消失,但我需要 mockito2。

compile ('org.powermock:powermock-api-mockito2:1.7.0') {...}

这可能是 Powermock 的一个缺陷。因此,我也在那里发布了一个问题......https://github.com/powermock/powermock/issues/821

示例 Android 项目:http://23.79.234.224/Anaina/cache/TestData2/ficticious_project.tar

编辑:添加显示它实际上只在一个包中引用的屏幕截图。

【问题讨论】:

  • 点击 Build 然后 Clean Project 并等待该过程完成。之后,再次点击Build,然后点击Rebuild Project

标签: android junit4 powermock powermockito


【解决方案1】:

从你的依赖中注释掉junit,如下所示

dependencies {
    repositories {
        mavenCentral()
    }
    testCompile 'junit:junit:4.12'
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile ("org.powermock:powermock-module-junit4:$powerMockVersion") {
        exclude group: 'org.objenesis', module: 'objenesis'
    }

    compile ('org.powermock:powermock-api-mockito2:1.7.0') {
        exclude group: 'org.mockito', module: 'hamcrest-core'
        exclude group: 'org.hamcrest', module: 'hamcrest-core'
        exclude group: 'junit' exclude group: 'org.mockito'
        exclude group: 'org.objenesis', module: 'objenesis'
    }

//    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
//        exclude group: 'com.android.support', module: 'support-annotations'
//    })

}

更多请查看this link

【讨论】:

  • 您好 Omi,感谢您的建议。但是,同样的问题仍然存在。我还必须重新添加 espresso 的内容,因为 android.support.test.InstrumentationRegistry 和 .AndroidJuni4 的内容在我找到之前无法找到。清理、重建,结果还是一样。
  • 您只是删除了注释掉的代码行还是我遗漏了什么?
【解决方案2】:

看来第一个问题可以通过将其添加到 build.gradle 文件的 android 元素中来解决

        dexOptions {
            jumboMode true
            multiDexEnabled true
        }

一旦我这样做了,我就不再遇到这篇文章中描述的问题。相反,我遇到了 java.beans 的问题。

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker
at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:66)
at java.lang.reflect.Proxy.invoke(Proxy.java:393)
at $Proxy0.isTypeMockable(Unknown Source)
at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:186)
at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:180)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
at org.mockito.Mockito.spy(Mockito.java:1812)
at com.akamai.android.sdk.internal.MapClientTestMainApp.getSystemService(MapClientTestMainApp.java:85)
at com.akamai.android.sdk.net.VocAccelerator.init(VocAccelerator.java:96)
at com.akamai.android.sdk.VocService.createVocService(VocService.java:143)
at com.akamai.vocsdkliveapitestlib.VocSdkLiveTest_BaseServiceTest.setVocService(VocSdkLiveTest_BaseServiceTest.java:217)
at com.akamai.vocsdkliveapitestlib.VocSdkLiveTest_BaseServiceTest.unRegisterIfNecessary(VocSdkLiveTest_BaseServiceTest.java:166)
at com.akamai.vocsdkliveapitestlib.VocSdkLiveTest_BaseServiceTest.waitForSyncToFinishAndThenDeregister(VocSdkLiveTest_BaseServiceTest.java:211)
at com.akamai.vocsdkliveapitestlib.VocSdkLiveTest_BaseServiceTest.unRegisterIfNecessary(VocSdkLiveTest_BaseServiceTest.java:151)
at com.akamai.vocsdkliveapitestlib.VocSdkLiveTest_BaseServiceTest.setUp(VocSdkLiveTest_BaseServiceTest.java:41)
at com.akamai.android.sdk.internal.MapLT_AICTests.setUp(MapLT_AICTests.java:64)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)
at junit.framework.TestResult.run(TestResult.java:118)
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)
at junit.framework.TestCase.run(TestCase.java:124)
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)
at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:69)
at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:103)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1970)
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/beans/Introspector;
at org.powermock.configuration.support.ConfigurationMapper.map(ConfigurationMapper.java:45)
at org.powermock.configuration.support.ConfigurationReaderBuilder$ConfigurationReaderImpl.mapConfiguration(ConfigurationReaderBuilder.java:89)
at org.powermock.configuration.support.ConfigurationReaderBuilder$ConfigurationReaderImpl.createConfiguration(ConfigurationReaderBuilder.java:80)
at org.powermock.configuration.support.ConfigurationReaderBuilder$ConfigurationReaderImpl.read(ConfigurationReaderBuilder.java:71)
at org.powermock.configuration.support.ConfigurationFactoryImpl.readDefault(ConfigurationFactoryImpl.java:42)
at org.powermock.configuration.support.ConfigurationFactoryImpl.create(ConfigurationFactoryImpl.java:33)
at org.powermock.configuration.GlobalConfiguration.createConfig(GlobalConfiguration.java:75)
at org.powermock.configuration.GlobalConfiguration.<init>(GlobalConfiguration.java:59)
at org.powermock.configuration.GlobalConfiguration.mockitoConfiguration(GlobalConfiguration.java:40)
at org.powermock.api.mockito.mockmaker.PowerMockMaker.<init>(PowerMockMaker.java:45)
at java.lang.Class.newInstance(Native Method)
at org.mockito.internal.configuration.plugins.PluginLoader.loadImpl(PluginLoader.java:96)
at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:45)
at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:18)
at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:17)
at org.mockito.internal.configuration.plugins.Plugins.getMockMaker(Plugins.java:33)
at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:24)
... 39 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.beans.Introspector" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.akamai.android.sdk.internal.test-1/base.apk", zip file "/data/app/com.akamai.android.sdk.internal-1/base.apk"],nativeLibraryDirectories=[/data/app/com.akamai.android.sdk.internal.test-1/lib/arm, /data/app/com.akamai.android.sdk.internal-1/lib/arm, /data/app/com.akamai.android.sdk.internal.test-1/base.apk!/lib/armeabi-v7a, /data/app/com.akamai.android.sdk.internal-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
... 56 more
Suppressed: java.lang.ClassNotFoundException: java.beans.Introspector
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 57 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

基于此,我认为Stack Overflow Post 确实可以总结为什么 PowerMock 无法在 Android 上以当前状态运行。

也许这可以帮助某人....

【讨论】:

    【解决方案3】:

    apparentlypowermock 的 powermock-api-mockito2 模块及其直接依赖项 org.powermock:powermock-api-mockito-common(均为 1.7.4 版本)为类声明 .class 文件:

    1. org.powermock.api.mockito.expectation.WithoutExpectedArguments
    2. org.powermock.api.mockito.expectation.WithExpectedArguments

    我能够通过添加以下排除来解决构建错误:

    androidTestImplementation('org.powermock:powermock-api-mockito2:1.7.4') {
        exclude group: 'org.powermock', module: 'powermock-api-mockito-common'
    }
    

    我不确定 powermock 的 mockito API 是否会在此之后工作,但是,因为删除整个模块太过分了......我真的很想能够只删除 dup 类,但我不能在现代 gradle 中找到一种方法。

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2018-03-15
      • 2015-07-23
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      相关资源
      最近更新 更多