gpt4 book ai didi

java - powermockito:如何模拟枚举中的抽象方法

转载 作者:行者123 更新时间:2023-12-03 02:31:33 37 4
gpt4 key购买 nike

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

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

}

Full example

关于java - powermockito:如何模拟枚举中的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45414070/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com