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



我依赖于枚举单例类,例如

public enum SingletonObject {
INSTANCE;

SingletonObject() {
// some annoying initialization
}
public callDB() {
this.num = num;
}
}

我正在尝试测试这样的类

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

在这个答案之后,我尝试使用以下代码简单地测试模拟,但我似乎遇到了枚举调用其构造函数的问题

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

使用界面似乎有些有希望,但我质疑这是否是解决这个问题的最佳方式。

看起来PowerMockito也很有前途,但出于各种原因,我想将其作为最后的手段。

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

试试这样的事情。 这将创建 'MyClass' 的部分模拟和一个 Mock 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();
}

最新更新