2

我有一个单元测试试图创建一个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 文档,我的代码看起来应该可以正常工作。
4

2 回答 2

2

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


发布到 Powermock Google Group 后,我收到了以下回复

自 powermock 1.2.5 起,您可以在这些类中模拟、抑制方法、存根方法等,但不能抑制静态初始化程序。

于 2013-10-15T18:56:47.613 回答
2

请参阅此页面:Google 群组 PowerMock 群组

您需要添加到类:@PowerMockIgnore("javax.management.*")

于 2015-05-14T10:06:19.657 回答