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()
正在调用。
我做错了什么?
回答:
- 枚举中的每个常量都是一个静态的最终嵌套类。因此,要模拟它,您必须在PrepareForTest中指向嵌套类。
MyEnum.values()
返回预初始化的数组,因此在您的情况下也应进行模拟。- 每个枚举常量都只是一个
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