java - PowerMockRunner初始化错误

标签 java junit powermockito

我正在尝试使用 PowerMockito 来模拟抛出 IOException 的静态类。我在我的包中使用 JUnit 4.12 和 PowerMockMockito 1.6.3。但是,由于我需要将“@RunWith(PowerMockRunner.class)”注释放在类定义之上,因此我收到“initializationError”。即使测试类为空,也会发生这种情况。

这是错误的堆栈跟踪:

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.validateTestMethods(PowerMockJUnit4MethodValidator.java:97)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validateInstanceMethods(PowerMockJUnit4MethodValidator.java:67)
at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:70)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:156)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:61)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我尝试解决这个问题导致我遇到了几个较旧的问题,例如 this一、PowerMockito更新到1.6.1后解决了类似的问题。不幸的是,这没有多大帮助。

我是 PowerMockito 的新手,所以我可能会遗漏一些太明显而无法在任何指南中提及的内容。关于如何解决这个问题有什么想法吗?提前致谢。

最佳答案

如果整个事情都是你的代码,那么一个不那么微妙的解决方案将是: 完全避免PowerMock等此类问题。相反,要接受静态在良好的面向对象设计中是一种异常现象——因为它会导致类的直接、硬耦合。

因此,与其编写难以测试的需要 Powermock 锤子才能测试的代码,不如编写避免静态的代码;因此无需 Powermock 即可进行测试。

长话短说:了解如何编写可测试的代码(例如通过收听这些[视频][1])。并关闭 Powermock 房间的门。当那个静态东西存在于您不拥有的外部代码中时;您可能仍然在它周围放置一个包装器并避免直接依赖。

编辑:当然,解决像 Apache commons 这样的核心问题很麻烦,但是,您仍然可以总是执行以下操作:

class TheStaticThing {
  public static Whatever doSomething(Somethin els) throws StupidException { ...

您可以转发并“连接”此内容:

interface TheStaticThingFunctionality {
  public static Whatever doSomething(Somethin els) throws StupidException;

然后你就有了一个简单的

class TheStaticThingImpl implements TheStaticThingFunctionality {
  @Override
  public Whatever doSomething(Somethin els) throws StupidException { 
     return TheStaticThing.doSomething(els);
  }

现在在您的客户类别中:

class Client {
   private final TheStaticThingFunctionality func;
   Client() { this(new TheStaticThingImpl()); }
   Client(TheStaticThingFunctionality func) { this.func = func; }

此代码允许您:

  1. 以最小的开销继续使用现有的静态方法
  2. 将 TheStaticThingFunctionality 的模拟实例传递到您的 Client 类中

现在您可以完全控制飞行的异常(exception)情况;更重要的是:您已经迈出了将自己与 Apachace commons 提供的实现解耦的第一步 - 因为如果您认为有需要,您现在可以自由地将 TheStaticThingImpl 与其他东西交换!

关于java - PowerMockRunner初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39357534/

相关文章:

java - 如何在 JUnit 测试中强制 Mockito 抛出 RemoteException

java - linkedList 的 toString 方法

java - 通过 JUnit 模拟文件读/写

JAVA扩展类的内存使用

java - 使用 JDBC 更新多行

java - 如何使用 Java/JavaFX 代码读取第二个数组上的 JSON 对象

junit - 与 jUnit 相比,TestNG 的缺点是什么?

java - NullPointerException PowerMock 用于具有实用方法和实例方法的类

java.lang.SecurityException : signer information does not match signer information of other classes in the same package in PowerMock

java - 在Java程序中没有处理FileNotFoundException文件吗?