我有一个单元测试试图创建一个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;”时 当前类 oracle/jdbc/driver/OracleDriver 的类加载器(org/powermock/core/classloader/MockClassLoader 的实例)和已解析类 java/lang/management/ManagementFactory 的类加载器(的实例)有javax/management/MBeanServer 类型的不同类对象;在签名中使用
- 我意识到我可以模拟
SQLException
它并且永远不会直接实例化它。我宁愿不走那条路,因为这意味着要更新 91 个不同的单元测试。我问了这个问题,因为根据 PowerMock 文档,我的代码看起来应该可以正常工作。