异常

2016-07-29 78 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

而对于包装你可能会写一个集成测试,如你预期,你的系统预计将测试的包装作品。