【发布时间】:2013-10-23 13:42:52
【问题描述】:
我有一个单元测试,它试图创建一个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 文档,我的代码看起来应该可以正常工作。
【问题讨论】:
-
抑制
DriverManager的初始化是否与您的测试相关? -
我的测试能够模拟数据库错误是相关的。最简单的方法是创建
SQLExceptions,但由于DriverManager,这会产生很多副作用 -
DriverManager的静态初始化程序在类路径上注册驱动程序。我很好奇这会如何在您的测试中造成副作用,除非您正在测试 JDBC 驱动程序实现本身。 -
它尝试在类路径上注册驱动程序。我不想要那个。当我没有任何驱动程序时,它会记录异常,因为我正在使用单元测试类路径运行。我不想要那个。我正在尝试在不运行 JDBC 代码的情况下测试我对数据库错误的错误处理。由于我正在单独测试组件,因此我不想运行额外/外部代码。
-
据我从 Powermock 文档中得知,我正在设置我的测试来做到这一点,但我的测试仍在运行外部代码。