web-dev-qa-db-ja.com

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<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;
    }
}

次の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);
    }
}
7
Selena

TestNG用にこの種のものを処理するPowerMockTestCaseクラスを拡張することで、これを機能させました。

@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);

    }
}
3
Selena

PowerMockRunnerでこれを実行する必要があります

例えば。

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

    @BeforeMethod
    public void setUp() {
        mockEnumerable = mock(ExampleEnumerable.class);
    }
}
5
steves165