繁体   English   中英

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

[英]What's the difference between using @BeforeClass and using instance or static variable in JUnit 4 Java?

我是单元测试的新手。 关于在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();

}

有什么不同?

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

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

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

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

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

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

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

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

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

@BeforeClass用于静态初始化。

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

@Before@Test

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

继承增加了另一个皱纹:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM