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)
2条答案
按热度按时间yh2wf1be1#
使用
@SuppressStaticInitializationFor("org.apache.hadoop.conf.CoreDefaultProperties")
抑制的静态初始化org.apache.hadoop.conf.CoreDefaultProperties
班级。您可以在powermock文档中找到更多信息。如果您刚刚开始编写应用程序,那么更好的方法是创建一个类 Package 器,它将在系统中封装静态调用和 Package 器。有一个好校长:不要嘲笑你没有的东西。
对于 Package 器,您可以编写一个集成测试来测试 Package 器是否按照您的预期和系统的预期工作。
yqkkidmi2#
这不是一个直接的解决方案,而是一个合理的解决方案:我假设,您想使用powermock来测试您的代码,必须进行这个静态调用,然后使用它返回的结果。
因此,不要“直接”进行这个静态调用,而是围绕这个功能创建一个 Package 器,比如:
以及实现该方法的相应类(通过实际执行静态调用)。
现在您可以更改其他生产代码以使用新接口;现在,您的所有客户端代码都可以进行测试,而无需使用powermokito。。。因为没有更多的静态调用。
当然,您可能希望使用powermokito来确保您的新 Package 器实现正是您所期望的那样。