如何在每个测试方法中强制运行静态块?

我发现静态块只在我执行多个JUnit测试时运行一次。 如何强制它为每个测试方法运行? 我正在使用最新的JUnit 4.8.2

另外,根据xUnit设计原则,每种方法都应该完全独立于其他方法。 为什么静态块只能执行一次?

@Test TestMethod1 () { Accounts ac = new Accounts(); ac.method1(); //kill the thread inside } @Test TestMethod2 () { Accounts ac = new Accounts(); ac.method2(); // the thread is no longer available!! } class Accounts { static { // initalize one thread to monitor something } } 

TestMethod1TestMethod2在不同的测试类中时,甚至会发生这种情况。

静态块仅在类加载时执行,因为它们就是这样的:类初始化器。 让一个静态块运行多次需要你卸载类(这不是一件容易的事情……)。

如果您需要使用静态块,您可以想出测试它们的方法。 为什么不将块解包为公共(静态)方法? 你在这个世界所要做的就是测试方法:

  static { staticInitMethod(); } public static void staticInitMethod(){ //insert initialization code here } 

你也可以只使用一个普通的初始化器

  {//not static //insert initialization code here } 

虽然,事实是大多数代码都不需要使用像这样的初始化器。

编辑:结果Oracle喜欢静态方法方法http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

为什么静态块只能执行一次?

因为这是静态初始化程序块的重点!

或者换句话说,如果你想要一些初始化代码执行多次,将它放在常规构造函数或方法中,或者(在极少数情况下)非静态初始化程序块。


在JUnit的上下文中,使用setUp()tearDown()方法实现测试启动和关闭代码的常规方法。


如果你试图在自己的代码中对静态初始化的执行进行unit testing,那么我认为你是一条艰难的道路。 但是,对具有静态状态(例如单身)的代码进行unit testing总是很困难……而这也是人们认为静态是一个坏主意的原因之一。

  • 考虑使用dependency injection(又名反转控制)框架而不是单例。

  • 或者,考虑修改单例/静态初始化代码以使其更容易测试。 例如,添加一个允许测试重新执行初始化的静态方法。 (在你说这打破单身模式之前:是的,我知道。你需要在设计/实施“纯度”和易于测试之间做出选择。)

是否正在测试类的测试的静态代码?

如果代码是静态的,那么测试可以共享,那么您需要将代码移动到自己的类中。 然后要么让测试类构造函数实例化一个静态实例,要么创建一个执行相同操作的测试套件。

如果您希望每个测试都独立,那么将您在静态块中执行的操作移动到setup()/ teardown()方法中,这就是它们的用途。

嗯……让它变得非静态 ? 您也可以拥有实例初始化程序块(与静态块相同,只是没有static关键字)。 但是测试设置代码实际上应该进入显式的setUp()@Before方法。