hconnectionmanager.class(hbase)的powermock期间发生异常

n3ipq98p  于 2021-06-10  发布在  Hbase
关注(0)|答案(2)|浏览(354)

PowerMockito.mockStatic(HConnectionManager.class); 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)
yh2wf1be

yh2wf1be1#

使用 @SuppressStaticInitializationFor("org.apache.hadoop.conf.CoreDefaultProperties") 抑制的静态初始化 org.apache.hadoop.conf.CoreDefaultProperties 班级。您可以在powermock文档中找到更多信息。
如果您刚刚开始编写应用程序,那么更好的方法是创建一个类 Package 器,它将在系统中封装静态调用和 Package 器。有一个好校长:不要嘲笑你没有的东西。
对于 Package 器,您可以编写一个集成测试来测试 Package 器是否按照您的预期和系统的预期工作。

yqkkidmi

yqkkidmi2#

这不是一个直接的解决方案,而是一个合理的解决方案:我假设,您想使用powermock来测试您的代码,必须进行这个静态调用,然后使用它返回的结果。
因此,不要“直接”进行这个静态调用,而是围绕这个功能创建一个 Package 器,比如:

interface ConnectionProvider {
  public HConneciotn createConnection(configuration);

以及实现该方法的相应类(通过实际执行静态调用)。
现在您可以更改其他生产代码以使用新接口;现在,您的所有客户端代码都可以进行测试,而无需使用powermokito。。。因为没有更多的静态调用。
当然,您可能希望使用powermokito来确保您的新 Package 器实现正是您所期望的那样。

相关问题