我有一个基于Gradle的Java项目,我现在想要使用PowerMock模拟一个私有方法。问题是我无法使用PowerMockRunner,因为我在添加@RunWith(org.powermock.modules.junit4.PowerMockRunner.class)
注释时总是遇到以下异常。
错误:
org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:581)
at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:308)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate TestMethods(PowerMockJUnit4MethodValidator.java:79)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate InstanceMethods(PowerMockJUnit4MethodValidator.java:49)
at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
...
这是我的测试依赖项:
testCompile 'junit:junit:4.+',
'org.powermock:powermock-core:1.5.6',
'org.powermock:powermock-module-junit4:1.5.6',
'org.powermock:powermock-api-mockito:1.5.6'
当完全为空(初始化错误)时,测试本身也会失败:
@RunWith(PowerMockRunner.class)
public class SomeTest {
@Test
public void testSomething() {
}
}
任何想法可能出错?使用PowerMock的其他测试工作正常(没有一个使用PowerMockRunner)。
问候和感谢任何帮助! 本
答案 0 :(得分:75)
这是使用JUnit 4.12和PowerMock<时出现的错误。 1.6.1。 PowerMock 1.6.1解决了这个问题。请相应地更新您的依赖项
testCompile 'junit:junit:4.12',
'org.powermock:powermock-core:1.6.1',
'org.powermock:powermock-module-junit4:1.6.1',
'org.powermock:powermock-api-mockito:1.6.1'
如果无法升级PowerMock,则可以使用JUnit 4.11。
testCompile 'junit:junit:4.11',
'org.powermock:powermock-core:1.5.6',
'org.powermock:powermock-module-junit4:1.5.6',
'org.powermock:powermock-api-mockito:1.5.6'
您能不能再添加堆栈跟踪的更多行,以了解有关该问题的更多详细信息。
答案 1 :(得分:1)
针对PowerMock记录了一个错误:https://code.google.com/p/powermock/issues/detail?id=531
似乎JUnit改变了PowerMock通过反射访问的一些内部字段名称,从而破坏了PowerMock正确注入自身的能力。
答案 2 :(得分:0)
检查Stefan所说的内容,以及您还需要添加
@PrepareForTest({<The class/es you are Mocking>, ...})
如果没有准备测试,PowerMockRunner将不知道哪个类被嘲笑。
答案 3 :(得分:0)
在类路径上也可能存在依赖项,这些依赖项会覆盖包含JUnit版本的JUnit特定类。这会导致PowerMock中的版本比较结果不正确。例如,我在类路径上有BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails).setObfuscatedAccountId(uid)
.build();
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
(来自hunspell库)。它会覆盖以下方法的返回结果:
com.google.android.tools:dx:1.7
通常它应该返回类似junit.runner.Version.id() => "3.8.1"
或"4.12"
等的内容。