当前位置: 首页 > 面试题库 >

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

穆城
2023-03-14
问题内容

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

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

}

完整的例子



 类似资料:
  • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。

  • 在Java(Spring Boot)应用程序中,我使用JUnit和Mockito,并想测试以下服务方法: 方法在以下抽象类中: 我尝试使用和stub通过,但在我看来,它不能像在具体的类中那样被模拟。那么,我应该如何模拟抽象类中的变量和方法呢?

  • 问题内容: 枚举可以有抽象方法吗?如果是这样,有什么用,并给出一个场景来说明这种用法。 问题答案: 是的,但是您可能更喜欢实现接口的枚举,请看这里。我认为它看起来好多了。这是抽象方法的示例:

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • 问题内容: 有这样的事情: 抽象类: 和扩展器: 我想要的是扩展,因为如果不处理它,然后尝试在中处理它。例如add- 但同时让类处理默认值,例如。 这是完全错误的方法吗? 到目前为止,我所做的就是添加一个接口。通常: 在课堂上: 在课堂上: 这看起来像是可用的设计吗? 并且,主要问题: 有没有什么好办法扩展该类,以便可以使用与in 中相同的切换方法?我想知道的是,有没有一个更好的设计,第二个是是否

  • 本文向大家介绍Java枚举抽象方法实例解析,包括了Java枚举抽象方法实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java枚举抽象方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求背景 需求已经确定了几个固定的常量值,并且每个常量值都有相同的行为,但是具体实现细节不同。建议使用枚举抽象方法,优点:结构清晰,便