Can';t将PowerMock与Robolectric和Gradle(android)配合使用
我尝试使用PowerMock和Robolectric来模拟我的android项目中的静态方法。我用的是gradle。但我得到了以下例外:Can';t将PowerMock与Robolectric和Gradle(android)配合使用,android,gradle,powermock,robolectric,Android,Gradle,Powermock,Robolectric,我尝试使用PowerMock和Robolectric来模拟我的android项目中的静态方法。我用的是gradle。但我得到了以下例外: Caused by: java.lang.IllegalStateException: PowerMockRule can only be used with the system classloader but was loaded by org.robolectric.bytecode.AsmInstrumentingClassLoader@7e61b85
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
完整的gradle文件(删除了一些真正不相关的内容):
有没有人有使用Powermockito进行基于机器人的Android单元测试的经验?知道我做错了什么吗?我创建了一个集成了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"));
}
}
上面的答案对我帮助很大,但是我仍然无法用RobelElectric 3和Mockito 2运行它 显然,当使用API级别21运行Robolectric时,桌面java版本中缺少一个类
如果其他人面临类似的问题,本指南将提供一个完整的工作示例,其中包含所有依赖项和设置:我使用本文尝试使其工作(使用文中提到的库),但它尚未工作。我觉得这是gradle和android的问题。请展示整个build.gradle文件。我更新了原始帖子并添加了更多的gradle文件。希望你有个主意!!:)@维特,你是怎么做到的?
// 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()
}
}
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"));
}
}