有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何用jmockit模拟枚举单例?

我依赖于enum单例类,比如

public enum SingletonObject {
  INSTANCE;
  
  SingletonObject() {
    // some annoying initialization
  }

  public callDB() {
    this.num = num;
  }

}

我想考一门课,比如

public class MyClass {
  public void doSomething() {
    // some code
    SingletonObject.INSTANCE.callDB();
  }
}

this answer之后,我尝试用下面的代码简单地测试mock,但我似乎遇到了enum调用其构造函数的问题

public class MyClassTest {
    @Mocked
    private SingletonObject singleton;
    
    @Before
    public void setup() {
        Deencapsulation.setField(SingletonObject.class, "INSTANCE", singleton);
    }
    
    @Test
    public void test() {
        assertSame(singleton, SingletonObject.INSTANCE);
    }
}

Using an interface似乎有点前途,但我怀疑这是否是解决这个问题的最佳方式

它看起来也像PowerMockito is promising,但出于各种原因,我想把它作为最后的手段

那么,如何在不调用其构造函数的情况下模拟这个枚举单例呢


共 (1) 个答案

  1. # 1 楼答案

    试试这样。这将创建“MyClass”的部分模拟和模拟SingletonObject,调用MyClass的(real)doSomething方法,并确认SingletonObject的(mock)callDB()方法被它精确调用一次

    @Test
    public void testdoSomething(
        @Mocked final SingletonObject singleton)
    {
        final MyClass clz = new MyClass();
    
        new Expectations(clz)
        {
            {
                SingletonObject.INSTANCE.callDB();
                times = 1;
            }
        };
        clz.doSomething();
    }