【问题标题】:Unable to run JUnit test with PowerMockRunner无法使用 PowerMockRunner 运行 JUnit 测试
【发布时间】:2014-11-29 08:05:46
【问题描述】:

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

您好,感谢您的帮助! 本

【问题讨论】:

    标签: java exception junit powermock


    【解决方案1】:

    这是在您使用 JUnit 4.12 和 PowerMock

    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 1.6.1 修复了这个问题。
    • @JeeBee 它似乎也没有在1.6.1 中修复。我使用 Powemock 1.6.1 和 JUnit 4.12
    • 正如stackoverflow.com/questions/44513608/… junit: 4.12 powermock-api-mockito: 1.6.1 powermock-module-junit4: 1.6.1 中提到的那样。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      查看Stefan所说的,上面你还需要添加

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

      没有准备测试,PowerMockRunner 不会知道哪个类被模拟了。

      【讨论】:

        【解决方案4】:

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

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

        通常它应该返回类似"4.12""4.11" 等的东西。

        【讨论】:

          猜你喜欢
          • 2018-11-17
          • 1970-01-01
          • 2020-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多