Junit PowerMockito在模拟枚举的静态方法并在switch语句中使用该枚举对象时引发异常

Junit PowerMockito在模拟枚举的静态方法并在switch语句中使用该枚举对象时引发异常,junit,mockito,Junit,Mockito,我有一个enumMyEnum.java,它有一个static方法 //MyEnum.java enum MyEnum { ONE("one"), TWO("two"); private String value; MyEnum(String value){ this.value=value; } public static MyEnum getMyEnum(String value){ for(MyEnum myEnum : MyEnum.valu

我有一个
enum
MyEnum.java
,它有一个
static
方法

//MyEnum.java

enum MyEnum {

  ONE("one"),
  TWO("two");

  private String value;
  MyEnum(String value){
    this.value=value;
  }

  public static MyEnum getMyEnum(String value){
    for(MyEnum myEnum : MyEnum.values()){
      if(myEnum.value.equalsIgnoreCase(value))
      return myEnum;
    }
    return null;
  }
}
我正在使用
PowerMock
来模拟这个
enum
静态方法。我已经包括了所有必要的条件,比如

@Runwith(PowerMockRunner.class)
@PrepareForTest(MyEnum.class)

//Test function
PowerMockito.mockStatic(MyEnum.class);
一切都很好。但是如果我对enum的对象使用switch方法,那么它会抛出异常

MyEnum enum = MyEnum.ONE;
switch(enum){
case ONE:
break
}
此代码正在引发以下异常

    java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:191)
    at javassist.runtime.Desc.getClassObject(Desc.java:43)
    at javassist.runtime.Desc.getClazz(Desc.java:52)
    at com.newshunt.shared.presenters.tests.DummyTest.testStaticMethod(DummyTest.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.NullPointerException
    at com.newshunt.shared.presenters.tests.DummyTest$1.<clinit>(DummyTest.java:26)
    ... 37 more


Process finished with exit code -1
java.lang.ExceptionInInitializeError
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:191)
位于javassist.runtime.Desc.getClassObject(Desc.java:43)
位于javassist.runtime.Desc.getClazz(Desc.java:52)
位于com.newshunt.shared.presenters.tests.DummyTest.testStaticMethod(DummyTest.java:26)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
位于org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
位于org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:97)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runbeforesthenTesttheAfter(PowerMockJUnit44RunnerDelegateImpl.java:282)
位于org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
位于org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.invokeTestMethod(powermockjunit44runnerdelegateinpl.java:207)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.runMethods(powermockjunit44runnerdelegateinpl.java:146)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl$1.run(powermockjunit44runnerdelegateinpl.java:120)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.run(powermockjunit44runnerdelegateinpl.java:122)
位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
位于org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
位于org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:137)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
原因:java.lang.NullPointerException
在com.newshunt.shared.presenters.tests.DummyTest$1.(DummyTest.java:26)
... 37多
进程已完成,退出代码为-1

即使从日志中也不清楚是什么导致了这种异常的发生?其他人以前遇到过类似的问题吗?

< P>我的建议:考虑不要使用PrimoCK。< /P> PowerMock看起来像是许多问题的解决方案;但迟早,它可能会导致更多的问题。它破坏了覆盖范围,使更改底层JVM变得更加困难,等等

严肃地说:如果您的设计只能用PowerMock进行测试,这通常清楚地表明您的设计是不好的。所以:专注于重新编写测试中的代码

在您的情况下:我会开始质疑是否需要在枚举上使用静态方法。换句话说,你想用这段代码解决什么问题


但要回答实际的问题:您必须理解枚举常量本身表示为内部类。因此,您必须为@PrepareForest使用fullyQualifiedName属性。请看这个较新的示例。

很明显,我同意您的解决方案。我们正在努力重写我们的代码,使其更易于测试。但是现在我们不想干扰一些遗留类。enum类中的静态方法是基于其值返回enum。我不明白您的意思:“基于其值返回enum”。也许你想更新你的问题;或者我们把它拉到讨论中…我明白了。看看那个。。。您确定必须将该方法放入枚举中吗?您有什么建议吗?创建实用程序/帮助程序类并放置