如何使用PowerMock和Mockito模拟枚举类的实例?

我试着按照这个非常相似的问题的答案提供的例子,但它对我不起作用。 我收到以下错误消息:

java.lang.IllegalArgumentException: Cannot subclass final class class com.myproject.test.support.ExampleEnumerable at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447) at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378) at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318) at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxyClass(ClassImposterizer.java:123) at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:57) at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:110) at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:58) at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:143) 

我需要一个enum class的简单模拟实例。 我不需要模拟它的任何方法。

这是我想要模拟的类:

 public enum ExampleEnumerable implements IEnumerable { EXAMPLE_ENUM_1("Test Enum 1"), EXAMPLE_ENUM_2("Test Enum 2"); final String alias; ExampleEnumerable(final String alias) { this.alias = alias; } @SuppressWarnings({"VariableArgumentMethod", "unchecked"}) @Override public @Nullable String getAlias(final @Nonnull IEnumerable<? extends Enum>... context) { return alias; } } 

我有以下TestNG设置:

 import static org.powermock.api.mockito.PowerMockito.mock; @PrepareForTest({ ExampleEnumerable.class}) @Test(groups = {"LoadableBuilderTestGroup"}) public class LoadableBuilderTest { private ExampleEnumerable mockEnumerable; @BeforeMethod public void setUp() { mockEnumerable = mock(ExampleEnumerable.class); } } 

您需要使用PowerMockRunner运行它

例如。

 @RunWith(PowerMockRunner.class) @PrepareForTest({ ExampleEnumerable.class}) @Test(groups = {"LoadableBuilderTestGroup"}) public class LoadableBuilderTest { private ExampleEnumerable mockEnumerable; @BeforeMethod public void setUp() { mockEnumerable = mock(ExampleEnumerable.class); } } 

我通过扩展PowerMockTestCase类来为TestNG处理这种事情,从而实现了这个目的:

 @PrepareForTest(TestEnumerable.class) @Test(groups = {"LoadableBuilderTestGroup"}) public class LoadableBuilderTest extends PowerMockTestCase { private TestEnumerable mockEnumerable; @SuppressWarnings("unchecked") @BeforeMethod public void setUp() { mockEnumerable = PowerMockito.mock(TestEnumerable.class); } }