Wie kann ich verspotte eine Instanz einer enum-Klasse mit PowerMock & Mockito?

Versuchte ich zu Folgen, das Beispiel in der Antwort auf diese sehr ähnliche Frage, aber es funktioniert nicht für mich. Ich bekomme folgende Fehlermeldung:

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)

Ich brauche eine einfache mock-Instanz eine enum class. Ich brauche nicht zu spotten jeder seine Methoden.

Hier ist die Klasse, ich möchte mock:

public enum ExampleEnumerable implements IEnumerable<ExampleEnumerable> {
    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;
    }
}

Habe ich Folgendes TestNG setup:

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);
    }
}
Enum-Klassen sind die letzten Klassen, also können Sie nicht verspotten. Vielleicht erstellen Sie einen höheren level interface, dass Sie Ihre Enum implementieren kann, und Sie dann zu verspotten?
Es gibt viele links, die sagen, dass PowerMock kann es tun: groups.google.com/forum/#!Thema/powermock/hqrJaMi0Zrc, code.google.com/p/powermock/source/browse/trunk/modules/...,
Dass der zweite link sieht aus wie ein Beispiel, gibt es etwas, das nicht funktioniert, wenn Sie es versuchen?
Warum brauchen Sie, um dies zu tun? Ich kann nicht denken Sie an eine situation, wo Sie brauchen würde, um ein mock-enumeration.
enum-Klassen können Methoden definiert werden, möchten Sie vielleicht, Sie zu trennen out von Ihre Klasse unter test.

InformationsquelleAutor Selena | 2015-05-08

Schreibe einen Kommentar