使用PowerMockito模拟单例

时间:2016-05-04 07:55:11

标签: java testing mockito junit4 powermock

为了测试我编码的私有方法之一,我需要模拟一个Singleton。

使用PowerMockito测试了几种方法后:

PowerMockito.mockStatic(UtilDatabaseSoldeAutoCdeCommon.class);
Mockito.when(UtilDatabaseSoldeAutoCdeCommon.getInstance()).thenReturn(mockDatabase);

我永远无法嘲笑这门课。因此,我不能像在每个方法中那样测试我的方法,我访问数据库。

UtilDatabaseSoldeAutoCdeCommon定义如下:

public class UtilDatabaseSoldeAutoCdeCommon extends AbstractUtilDatabase {

private static UtilDatabaseSoldeAutoCdeCommon instance;

private UtilDatabaseSoldeAutoCdeCommon() {
    super();
}

public static UtilDatabaseSoldeAutoCdeCommon getInstance() {
    if(instance == null) {
        instance = new UtilDatabaseSoldeAutoCdeCommon();
    }
    return instance;
}

...
}

我调用powermockito时调用了getInstance(),但每次调用consructor时,它都会在尝试加载配置文件时崩溃(不存在)。

我确切地说,配置文件在UtilDatabaseEnrichissement的absract父类中被定义为一个常量,并在构造函数中使用。

我该如何测试这部分?

3 个答案:

答案 0 :(得分:10)

我认为这应该有效:

    @PrepareForTest({UtilDatabaseSoldeAutoCdeCommon.class})
    public class SomeTest {
        @Mock
        UtilDatabaseSoldeAutoCdeCommon fakeSingletonInstance;   

        @Test
        public void test() {
             Whitebox.setInternalState(UtilDatabaseSoldeAutoCdeCommon.class, "instance", fakeSingletonInstance);
             // Write here your test
        }
    }

答案 1 :(得分:1)

很久以前就问过这个问题,我也遇到了类似的问题,无法找到好的答案,所以现在就回答。我用抑制构造函数(如

)测试了该类
  

PowerMockito.suppress(UtilDatabaseSoldeAutoCdeCommon.class.getConstructors());

答案 2 :(得分:0)

PrepareForTest你模拟的单例类