Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t抑制DriverManager';静态初始化程序块_Java_Jdbc_Junit_Powermock - Fatal编程技术网

Java Can';t抑制DriverManager';静态初始化程序块

Java Can';t抑制DriverManager';静态初始化程序块,java,jdbc,junit,powermock,Java,Jdbc,Junit,Powermock,我有一个单元测试,它试图创建一个SQLException来模拟数据库错误。在SQLException的构造函数中,调用了具有静态初始化块的DriverManager。我想我可以用这种类型的设置来抑制静态块: @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor({"java.sql.DriverManager"}) public class StaticTest { @Test pu

我有一个单元测试,它试图创建一个
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可诊断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类型具有不同的类对象;在签名中使用

  • 我意识到我可以模拟
    SQLException
    ,而不会直接实例化它。我不想走这条路,因为这意味着要更新91个不同的单元测试。我问这个问题是因为根据PowerMock文档,我的代码应该可以正常工作
我怀疑(但我不确定)Powermock无法阻止由系统或引导类加载器加载的类(如jre类,包括包
java.sql
中的类)运行静态初始值设定项


在发布到Powermock Google组后,我得到:

自powermock 1.2.5以来,您可以在这些类中模拟、抑制方法、存根方法等,但不能抑制静态初始值设定项

我怀疑(但我不确定)Powermock无法阻止系统或引导类加载器加载的类(如jre类,包括包
java.sql
are中的类)运行静态初始值设定项


在发布到Powermock Google组后,我得到:

自powermock 1.2.5以来,您可以在这些类中模拟、抑制方法、存根方法等,但不能抑制静态初始值设定项

见本页:

您需要添加到类:
@PowerMockIgnore(“javax.management.*”)
请参见此页:



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

抑制
DriverManager
的初始化是否与您的测试相关?是否与我的测试能够模拟数据库错误相关。最简单的方法是创建
SQLException
s,但由于
DriverManager
的静态初始值设定项在类路径上注册了驱动程序,因此会产生一系列副作用。我很好奇这怎么会在测试中产生副作用,除非您测试的是JDBC驱动程序实现本身。它试图在类路径上注册驱动程序。我不想那样。当我没有任何驱动程序时,它会记录异常,因为我使用的是单元测试类路径。我不想那样。我试图在不运行JDBC代码的情况下测试我对数据库错误的错误处理。因为我是孤立地测试组件的,所以我不想运行额外的/外部代码。从Powermock文档中可以看出,我正在设置我的测试来实现这一点,但是我的测试仍在运行外部代码。抑制
DriverManager
的初始化与您的测试相关吗?我的测试能够模拟数据库错误与此相关。最简单的方法是创建
SQLException
s,但由于
DriverManager
的静态初始值设定项在类路径上注册了驱动程序,因此会产生一系列副作用。我很好奇这怎么会在测试中产生副作用,除非您测试的是JDBC驱动程序实现本身。它试图在类路径上注册驱动程序。我不想那样。当我没有任何驱动程序时,它会记录异常,因为我使用的是单元测试类路径。我不想那样。我试图在不运行JDBC代码的情况下测试我对数据库错误的错误处理。因为我是独立测试组件的,所以我不想运行额外的/外部代码。从Powermock文档中可以看出,我正在设置我的测试来实现这一点,但我的测试仍然在运行外部代码。我也考虑过这一点,但他们似乎说他们在Powermock 1.2.5中解决了这个问题,而我正在运行1.5(请参阅我的更新)。这是一个有效的结论还是我误读了文档?基于这个链接,我想说你的尝试应该有效,但我不确定。你的答案对<1.2.5的用户来说是有用的信息。谢谢你的思考结果是,你是对的。我用谷歌集团的一些信息更新了你的答案,我也考虑过,但他们似乎说他们在Powermock 1.2.5中解决了这个问题,我正在运行1.5(见我的更新)。这是一个有效的结论还是我误读了文档?基于这个链接,我想说你的尝试应该有效,但我不确定。你的答案对<1.2.5的用户来说是有用的信息。谢谢你的思考结果是,你是对的。我用Google组的一些信息更新了你的答案。在类级别添加此选项并没有消除警告,但链接错误消失,现在测试运行正常。在类级别添加此选项并没有消除警告,但链接错误消失,现在测试运行正常。