模拟静态实例

时间:2017-03-18 05:41:51

标签: mockito powermockito

class Continents{

    Map<String,String> COUNTRY_CURRENCY_MAP = Singleton.getInstance().getCountryCurrencyMap()

}

我正在尝试使用power mockito来模拟Singleton类,但我无法做到。

Continents continents = mock(Continents.class);
PowerMockito.mockStatic(Continents.class);
when(Continents.getInstance()).thenReturn(continents);
        when(continents.getCountryCurrencyMap()).thenReturn(new HashMap<String, String>());

但我面临以下问题 -

java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at javassist.runtime.Desc.getClassObject(Desc.java:43)
    at javassist.runtime.Desc.getClassType(Desc.java:152)
    at javassist.runtime.Desc.getType(Desc.java:122)
    at javassist.runtime.Desc.getType(Desc.java:78)

2 个答案:

答案 0 :(得分:2)

您是否包含注释?

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)

See this Q&A for related details

另一种方法是根本不使用PowerMock:您可以创建一个包装单例并使用普通Mockito进行模拟的服务。请参阅the wrapper pattern here的一些示例代码。

答案 1 :(得分:0)

如何在测试中模拟此字段COUNTRY_CURRENCY_MAP而不是

Continents continents = mock(Continents.class);
PowerMockito.mockStatic(Continents.class);
when(Continents.getInstance()).thenReturn(continents);
        when(continents.getCountryCurrencyMap()).thenReturn(new HashMap<String, String>());

您可以替换为

Continents continents = PowerMockito.spy(new Continents());
HashMap COUNTRY_CURRENCY_MAP = PowerMockito.mock(HashMap.class);
Whitebox.setInternalState(continents, "COUNTRY_CURRENCY_MAP", COUNTRY_CURRENCY_MAP);