为了测试我编码的私有方法之一,我需要模拟一个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父类中被定义为一个常量,并在构造函数中使用。
我该如何测试这部分?
答案 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你模拟的单例类