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
- 我意识到我可以模拟
,而不会直接实例化它。我不想走这条路,因为这意味着要更新91个不同的单元测试。我问这个问题是因为根据PowerMock文档,我的代码应该可以正常工作SQLException
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组的一些信息更新了你的答案。在类级别添加此选项并没有消除警告,但链接错误消失,现在测试运行正常。在类级别添加此选项并没有消除警告,但链接错误消失,现在测试运行正常。