異常

2016-07-29 58 views
1
  1. PowerMockito.mockStatic(HConnectionManager.class);
  2. when(HConnectionManager.createConnection(configuration)).thenReturn(hConnection)

什麼是嘲笑HBase的相關的配置文件的方式?當我得到:異常

java.lang.ExceptionInInitializerError 
    at com.mapr.fs.ShimLoader.load(ShimLoader.java:214) 
    at org.apache.hadoop.conf.CoreDefaultProperties.<clinit>(CoreDefaultProperties.java:60) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:274) 
    at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:1857) 
    at org.apache.hadoop.conf.Configuration.getProperties(Configuration.java:2072) 
    at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:2282) 
    at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2234) 
    at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2151) 
    at org.apache.hadoop.conf.Configuration.get(Configuration.java:871) 
    at org.apache.hadoop.conf.Configuration.getTrimmed(Configuration.java:890) 
    at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:1291) 
    at org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java:71) 
    at org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:107) 
    at org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:118) 
    at org.apache.hadoop.hbase.client.HConnectionManager.<clinit>(HConnectionManager.java:266) 
    at sun.reflect.GeneratedSerializationConstructorAccessor35.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45) 
    at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73) 
    at org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:14) 
    at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxy(ClassImposterizer.java:143) 
    at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:58) 
    at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
    at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
    at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:46) 
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) 
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) 
    at org.mockito.Mockito.mock(Mockito.java:1285) 
    at org.mockito.Mockito.mock(Mockito.java:1163) 

回答

1

不是直接的解決方案,但一個合理的解決辦法:我想,你想使用PowerMock測試代碼,有使這個靜態的召喚,然後用結果來從它回來。

因此,而不是「直接」使這個靜態調用,你創建一個包裝圍繞這一功能,如:

interface ConnectionProvider { 
    public HConneciotn createConnection(configuration); 

和實現該方法(通過實際上使靜態調用)對應的類。

現在你可以改變你的其他生產代碼與新的接口工作;現在,所有客戶端代碼都可以在不需要用戶PowerMokito的情況下進行測試...因爲不再需要靜態調用。

當然,你可能需要使用PowerMokito,以確保新包裝的實現做你期望它做什麼。

+0

提供的解決方案被稱爲ServiceStub圖案。在這種模式中,外部依賴通過使用接口而不是具體的實現保持鬆散耦合到核心體系結構。這使您可以在沒有運行實際服務的情況下測試代碼。 –

0

使用@SuppressStaticInitializationFor("org.apache.hadoop.conf.CoreDefaultProperties")打壓org.apache.hadoop.conf.CoreDefaultProperties類的靜態初始化。更多信息可以在PowerMock documentation中找到。

如果你剛開始編寫應用程序,然後,更好的辦法將是創建一個類包裝,將封裝靜態調用和系統中的包裝。有一個很好的校長:don't mock what you don't own

而對於包裝你可能會寫一個集成測試,如你預期,你的系統預計將測試的包裝作品。