powermockito:如何在枚举中模拟抽象方法

考虑以下(简化的)枚举:

MyEnum {

ONE public int myMethod() {

// Some complex stuff

return 1;

},

TWO public int myMethod() {

// Some complex stuff

return 2;

};

public abstract int myMethod();

}

可以在以下函数中使用它:

void consumer() {

for (MyEnum n : MyEnum.values()) {

n.myMethod();

}

}

我现在想为此编写一个单元测试,consumer以模拟每个枚举实例中对myMethod()的调用。我尝试了以下方法:

@RunWith(PowerMockRunner.class)

@PrepareForTest(MyEnum.class)

public class MyTestClass {

@Test

public void test() throws Exception {

mockStatic(MyEnum.class);

when(MyEnum.ONE.myMethod()).thenReturn(10);

when(MyEnum.TWO.myMethod()).thenReturn(20);

// Now call consumer()

}

但是,真正的实现ONE.myMethod()TWO.myMethod()正在调用。

我做错了什么?

回答:

  1. 枚举中的每个常量都是一个静态的最终嵌套类。因此,要模拟它,您必须在PrepareForTest中指向嵌套类。
  2. MyEnum.values() 返回预初始化的数组,因此在您的情况下也应进行模拟。
  3. 每个枚举常量都只是一个public final static字段。

全部一起:

@RunWith(PowerMockRunner.class)

@PrepareForTest(

value = MyEnum.class,

fullyQualifiedNames = {

"com.stackoverflow.q45414070.MyEnum$1",

"com.stackoverflow.q45414070.MyEnum$2"

})

public class MyTestClass {

@Test

public void should_return_sum_of_stubs() throws Exception {

final MyEnum one = mock(MyEnum.ONE.getClass());

final MyEnum two = mock(MyEnum.TWO.getClass());

mockStatic(MyEnum.class);

when(MyEnum.values()).thenReturn(new MyEnum[]{one, two});

when(one.myMethod()).thenReturn(10);

when(two.myMethod()).thenReturn(20);

assertThat(new Consumer().consumer())

.isEqualTo(30);

}

@Test

public void should_return_stubs() {

final MyEnum one = mock(MyEnum.ONE.getClass());

when(one.myMethod()).thenReturn(10);

Whitebox.setInternalState(MyEnum.class, "ONE", one);

assertThat(MyEnum.ONE.myMethod()).isEqualTo(10);

}

}

完整的例子

以上是 powermockito:如何在枚举中模拟抽象方法 的全部内容, 来源链接: utcz.com/qa/410482.html

回到顶部