当前位置: 首页 > 知识库问答 >
问题:

不能将PowerMock与Robolectric和Gradle(android)一起使用

丌官炎彬
2023-03-14
Caused by: java.lang.IllegalStateException: PowerMockRule can only be used with the system classloader but was loaded by org.robolectric.bytecode.AsmInstrumentingClassLoader@7e61b85
at org.powermock.modules.junit4.rule.PowerMockRule.<clinit>(PowerMockRule.java:35)
... 47 more
...
import org.junit.Rule;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.powermock.modules.agent.PowerMockAgent;
import org.powermock.core.classloader.annotations.*;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.rule.PowerMockRule;

@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@Config(manifest = "./src/main/AndroidManifest.xml",emulateSdk = 18)
public class MyTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();


    @Test
    public void test() {
       ...
    }
}
apply plugin: 'com.android.application'

String[][] allowedFlavorCombinations = [
        ...
];

android.variantFilter { variant ->
    boolean buildVariant = false;
    for (int i = 0; i < allowedFlavorCombinations.length; i++) {
        if(allowedFlavorCombinations[i][0].equalsIgnoreCase(variant.getFlavors().get(0).name)
                && allowedFlavorCombinations[i][1].equalsIgnoreCase(variant.getFlavors().get(1).name)) {
            buildVariant = true;
        }
    }
    variant.setIgnore(!buildVariant);
}

android {
    compileSdkVersion 20
    buildToolsVersion "20"

    defaultConfig {
        minSdkVersion 11
        targetSdkVersion 20
        versionCode=139
        versionName="3.0"
    }

    sourceSets {
        instrumentTest.setRoot('src/test')
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

    signingConfigs {
        release
    }
    buildTypes {
        release {
            minifyEnabled false
            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                variant.outputs.each  { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
                }
            }
        }
    }

    if (project.hasProperty('storeFile') &&
            project.hasProperty('storePassword') &&
            project.hasProperty('keyPassword')) {
        android.signingConfigs.release.storeFile = file(storeFile)
        android.signingConfigs.release.storePassword = storePassword
        android.signingConfigs.release.keyPassword = keyPassword
        android.signingConfigs.release.keyAlias = keyAlias
    } else {
        buildTypes.release.signingConfig = null
    }

    flavorDimensions "client", "settings"

    productFlavors {
        ...
    }
}

sourceSets {
    unitTest {
        java.srcDir file('src/test/java')
        resources.srcDir file('src/test/res')
    }
}

configurations {
    unitTestCompile.extendsFrom runtime
    unitTestRuntime.extendsFrom unitTestCompile
}

dependencies {
    compile 'com.android.support:appcompat-v7:20.0.0'
    compile 'com.android.support:recyclerview-v7:21.0.0'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.google.android.gms:play-services:6.1.71'
    compile 'com.android.support:support-v4:21.0.0'
    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.android.support:gridlayout-v7:21.0.+'
    compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

    unitTestCompile files("$project.buildDir/intermediates/classes/testbase/debug/")
    ...
    unitTestCompile 'junit:junit:4.11'
    unitTestCompile 'com.loopj.android:android-async-http:1.4.6'
    unitTestCompile('org.robolectric:robolectric:2.3:jar-with-dependencies') {
        exclude module: 'support-v4'
    }
    unitTestCompile 'com.google.android:android:4.1.1.4'
    unitTestCompile 'org.mockito:mockito-core:1.10.8'
    unitTestCompile 'org.powermock:powermock-api-mockito:1.6.1'
    unitTestCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.1'
    unitTestCompile 'org.powermock:powermock-module-junit4-rule:1.6.1'
    unitTestCompile 'org.powermock:powermock-module-junit4:1.6.1'
    unitTestCompile 'com.android.support:appcompat-v7:20.0.0'
    unitTestCompile 'com.google.code.gson:gson:2.3'
    unitTestCompile 'com.google.android.gms:play-services:6.1.71'
    unitTestCompile 'com.android.support:support-v4:21.0.0'
    unitTestCompile 'joda-time:joda-time:2.5'
    unitTestCompile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

    instrumentTestCompile 'junit:junit:4.11'
    instrumentTestCompile('org.robolectric:robolectric:2.3:jar-with-dependencies') {
        exclude module: 'support-v4'
    }
}

task unitTest(type:Test, dependsOn: [assembleDefault, ':AndroidUtilitiesLibrary:unitTest', ':AndroidUraLibrary:unitTest']) {
    testClassesDir = project.sourceSets.unitTest.output.classesDir
    classpath = project.sourceSets.unitTest.runtimeClasspath
}
check.dependsOn unitTest
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
           jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
    }
}

subprojects {
    apply plugin: 'android-sdk-manager'
}

allprojects {
    repositories {
           jcenter()
    }
}

共有1个答案

袁骏祥
2023-03-14

我创建了一个示例项目,该项目集成了Robolectric3+RobolectricgradletestRunner+PowerMock+Mockito

build.gradle:

dependencies {

    ...

    testCompile "org.powermock:powermock-module-junit4:1.6.2"
    testCompile "org.powermock:powermock-module-junit4-rule:1.6.2"
    testCompile "org.powermock:powermock-api-mockito:1.6.2"
    testCompile "org.powermock:powermock-classloading-xstream:1.6.2"
}

测试类:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 18)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(Static.class)
public class DeckardActivityTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    @Test
    public void testStaticMocking() {
        PowerMockito.mockStatic(Static.class);
        Mockito.when(Static.staticMethod()).thenReturn("hello mock");

        assertTrue(Static.staticMethod().equals("hello mock"));
    }
}
 类似资料:
  • 我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法。我使用的是JUnit 4.8.2、Robolectric2.2、Mockito 1.9.5和PowerMock 1.9.5。由于我必须使用RoboElectricTestRunner,所以我尝试使用PowerMockRule来引导PowerMock。然而,当使用PowerMock运行测试时,不幸

  • null 模拟UI元素的Robolectric 逻辑测试的单元测试 静态方法mock的PowerMock Robolectric+PowerMock集成问题已知,解决方案也已知--https://github.com/Robolectric/Robolectric/wiki/using-powerMock ,但使用此解决方案时,dagger2依赖项失败。 注意代码。 我的自定义视图: Progre

  • 我正在尝试让web workers启动并运行Vue cli3,但我遇到了麻烦,无法让它正常工作。 我想使用下面的包worker-loader(而不是vue-worker),因为它看起来维护得很好,而且有更多的贡献。 在他们的教程之后,我尝试使用vue cli修改webpack,如下所示: 我希望能和他们的相配 可以在这里阅读(https://github.com/webpack-contrib/w

  • 我使用Java9.0.4创建了一个javafx项目。代码可以编译和工作。我可以使用内部的SceneBuilder。 但是当我从JFoenix9.0.1库导入元素时,我就不能再使用sceneBuilder了。

  • 我一直使用ElasticsearchIntegrationTest在没有elasticsearch服务器的情况下测试我的代码。我的类中的私有成员很少,所以考虑使用Powermock访问私有成员。在运行测试时,我得到异常。 Powermock是否可以与ElasticSearchintegrationTest一起使用?? 代码: 例外情况: 原因:javassist.CanNotCompileExce

  • 背景 我在我的android应用程序中使用清洁架构。我的域和数据层高度基于RxJava(RxAndroid)。我还在使用Parse(BaaS)。 问题 我知道Android Parse SDK在幕后做了很多工作,比如缓存和加密数据。将其同步调用与RxJava的调度器一起使用真的很稳定吗<我知道RxJava可以很好地进行改装。我应该放弃Parse SDK,转而使用他们的REST API吗? 帮帮我,