无法抑制DriverManager的静态初始化程序块

时间:2013-10-15 16:42:31

标签: java jdbc junit powermock

我有一个单元测试尝试创建SQLException来模拟数据库错误。在SQLException的构造函数中,调用DriverManager,它有一个静态初始化块。我想我可以使用这种类型的设置来抑制静态块:

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor({"java.sql.DriverManager"})
public class StaticTest 
{
    @Test
    public void testStaticSuppress() throws Exception
    {
        SQLException ex = new SQLException();
        expect(...).andThrow(ex);
    }
}

当我运行测试时,仍会调用DriverManager中的静态块。我做错了什么?


澄清

  • 我正在运行Powermock 1.5 - 我的印象是使用v1.5允许我模拟系统类
  • DriverManager运行它的静态初始化块时,我得到了这个例外:
  

2013年10月15日下午1:06:24 oracle.jdbc.driver.OracleDriver registerMBeans

     

警告:注册Oracle JDBC Diagnosability MBean时出错。

     

java.lang.LinkageError:加载器约束违规:解析方法时“java.lang.management.ManagementFactory.getPlatformMBeanServer()Ljavax / management / MBeanServer;”当前类的类加载器(org / powermock / core / classloader / MockClassLoader的实例),oracle / jdbc / driver / OracleDriver,以及已解析类java / lang / management / ManagementFactory的类加载器(实例), javax / management / MBeanServer类型的不同Class对象;用于签名

  • 我意识到我可以模仿SQLException并且永远不会直接实例化它。我宁愿不去那条路,因为它意味着要更新91个不同的单元测试。我问了这个问题,因为看起来我的代码应该可以正常工作,根据PowerMock文档。

2 个答案:

答案 0 :(得分:2)

我怀疑(但我不确定)Powermock无法阻止静态初始化程序为系统或引导类加载器加载的类运行(如包括java.sql包的jre类)。


在发布到Powermock Google Group后,我得到了this response

  

自powermock 1.2.5起,您可以在这些类中模拟,抑制方法,存根方法等,但是您无法抑制静态初始值设定项。

答案 1 :(得分:2)

请参阅此页:Google Groups PowerMock Group

您需要添加到班级:'service_manager' => array( 'factories' => array( 'Application\Cache\Redis' => 'Application\Service\Factory\RedisFactory', ), 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 'Zend\Log\LoggerAbstractServiceFactory' ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ),