使用@BeforeClass和在JUnit 4 Java中使用实例或静态变量有什么区别?

我是unit testing的新手。 关于在JUnit 4中使用@Before注释的目的。 我只是不知道使用它的意义:

 public class FoodTestCase { static private Food sandwich; @BeforeClass public static void initialise(){ sandwich = new Sandwich(); } } 

VS

 public class FoodTestCase { static private Food sandwich = new Sandwich(); } 

有什么不同?

我认为这个想法是这样的:你使用@AfterClass来释放资源。 然后让@BeforeClass获取它们是合乎逻辑的。 因为让开发人员猜测他需要使用静态块可能不是一个好主意。

在这种情况下,可能没有必要,因为初始化非常简单。

如果您有一些日志记录,复杂的初始化或需要释放一些资源,您必须使用@BeforeClass和@AfterClass

几乎没有区别。 但是如果Sandwich构造函数抛出exception,则无法直接初始化它static private Food sandwich = new Sandwich(); 但必须用try/catch块包装初始化。 但是,方法initialise()可能被声明为throws MyException ,因此如果在初始化期间确实抛出了exception,则测试用例将失败。

假设您在数据库表的后端设置了所有与食物相关的数据(比如菜单)。 您的食物测试用例可能与更新菜单(基本上所有CRUD操作)有关。

而不是为每个测试用例打开一个DB连接(使用@Before ); 如果您在通过标记为@BeforeClass的方法运行所有测试用例之前只执行一次将是明智的。

现在使用方法是有意义的,因为设置很可能会稍微复杂一些(您可能决定使用Spring容器从DataSource获取Connection ),并且您无法通过声明的单行来实现它你的Connection对象。

同样,您可以使用@AfterClass拆除全局设置(针对所有测试用例),即在此处关闭数据库连接。

在你的特定例子中 – 并不多。 但是,还有@Before注释将在您class级的每个测试之前运行。 看看http://selftechy.com/2011/05/17/junit4-before-vs-beforeclass-after-vs-afterclass ,它在那里得到了很好的解释。

@BeforeClass用于静态初始化。

此处创建的实例将在所有@Test重复使用

@Before@Test

通常@BeforeClass保留用于实例化相对昂贵的对象。
例如数据库连接

inheritance增加了另一个皱纹:

假设您有两个扩展公共基类的JUnit测试。 我们假设基类同时具有静态初始化块 @BeforeClass方法。 在这种情况下,静态初始化程序块将运行一次 ,而@BeforeClass方法将运行两次

因此,如果您需要在共享公共基类的整个测试用例集中设置非常昂贵的计算或资源,那么您可以使用静态初始化程序块。