【问题标题】:Can't suppress DriverManager's static initializer block无法抑制 DriverManager 的静态初始化程序块
【发布时间】: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 文档中得知,我正在设置我的测试来做到这一点,但我的测试仍在运行外部代码。

标签: java jdbc junit powermock


【解决方案1】:

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


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

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

【讨论】:

  • 我也想过这个问题,但docs 似乎说他们在 Powermock 1.2.5 中修复了这个问题,而我正在运行 1.5(请参阅我的更新)。这是一个有效的结论还是我误读了文档?
  • 基于该链接,我会说您尝试的方法应该有效,但我不确定。
  • 嗯,您的回答对于
  • 事实证明,你是对的。我用 Google 网上论坛的一些信息更新了你的答案
【解决方案2】:

查看此页面:Google Groups PowerMock Group

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

【讨论】:

  • 在类级别添加这个并没有消除警告,但链接错误消失了,现在测试运行正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多