7

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

}

有什么不同?

4

7 回答 7

3

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

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

于 2013-06-12T08:01:58.720 回答
2

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

于 2013-06-12T08:04:08.443 回答
2

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

于 2013-06-12T08:24:06.813 回答
1

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

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

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

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

于 2013-06-12T08:21:38.580 回答
0

@BeforeClass用于静态初始化。

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

@Before@Test.

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

于 2013-06-12T08:07:14.583 回答
0

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

于 2013-06-12T08:02:57.053 回答
0

继承又增加了一个皱纹:

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

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

于 2015-07-10T21:05:23.617 回答