我有一个单元测试尝试创建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
中的静态块。我做错了什么?
澄清
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文档。答案 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',
),
),