【问题标题】:What's the difference between using @BeforeClass and using instance or static variable in JUnit 4 Java?在 JUnit 4 Java 中使用 @BeforeClass 和使用实例或静态变量有什么区别?
【发布时间】:2013-06-12 07:56:14
【问题描述】:

我是单元测试的新手。关于在JUnit 4中使用@Before注解的目的。我只是不知道使用它的意义:

public class FoodTestCase {
    static private Food sandwich;

    @BeforeClass
    public static void initialise(){
        sandwich = new Sandwich();    
    }

}

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

}

有什么区别?

【问题讨论】:

    标签: java unit-testing junit4


    【解决方案1】:

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

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

    【讨论】:

    • 您可以使用静态块来进行初始化。 static { ... } 唯一不同的情况是你的初始化代码抛出检查异常
    • 释放资源怎么样?您不能在静态块中执行此操作。嗯,你可以,但不是在真正需要的时候。
    • 您可以在静态块中获取资源并使用finalize()。不是最好的方法。 JUnit API让开发者了解更少的java,写出更好的代码)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            @BeforeClass 用于静态初始化。

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

            @Before 是每个 @Test

            通常@BeforeClass 保留给实例化成本相对较高的对象。
            例如数据库连接

            【讨论】:

              【解决方案7】:

              继承又添了一个皱纹:

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

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

              【讨论】:

                猜你喜欢
                • 2013-03-07
                • 2012-02-08
                • 2022-09-23
                • 2011-01-14
                • 1970-01-01
                • 2014-02-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多