无法使用PowerMockRunner运行JUnit测试



我有一个基于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)。

问候并感谢您的帮助!Ben

这是使用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'

能否请您添加堆叠竞赛的更多行,以揭示有关该问题的更多细节。

PowerMock记录了一个错误:https://code.google.com/p/powermock/issues/detail?id=531

JUnit似乎更改了PowerMock通过反射访问的一些内部字段名称,从而破坏了PowerMok正确注入自身的能力。

检查Stefan说了什么,除此之外,您还需要添加

@PrepareForTest({<The class/es you are Mocking>, ...})

如果没有测试准备,PowerMockRunner将不知道哪个类被嘲笑。

类路径上也可能存在覆盖包含JUnit版本的特定于JUnit的类的依赖项。这导致PowerMock中的版本比较结果不正确。例如,我在类路径上有com.google.android.tools:dx:1.7(来自hunspell库)。它覆盖以下方法返回结果:

junit.runner.Version.id() => "3.8.1"

通常它应该返回类似"4.12""4.11"等的内容。

相关内容

  • 没有找到相关文章

最新更新