@Before和@BeforeClass有什么意义?

时间:2019-10-08 16:54:19

标签: java junit

为什么不使用这些JUnit 4注释,为什么不只使用静态块和实例初始化器块呢?以下代码显示,每当静态初始化程序块运行时,就会运行@BeforeClass方法,而每当实例初始化程序块运行时,就会运行@Before方法。那为什么我们需要它们?

public class DemoTest {

    static {
        System.out.println("init static");
    }

    {
        System.out.println("init instance");
    }

    @BeforeClass
    public static void setUpAll() {
        System.out.println("beforeClass");
    }

    @Before
    public void setUp() {
        System.out.println("before");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

4 个答案:

答案 0 :(得分:2)

如果您的测试用例不需要@Before等提供的附加功能,那么您当然可以自由使用它们。

由于您不能使用这些结构与@After@AfterClass做相同的事情,因此对称,可重用和易读性将它们包括在相同的格式。

此外,对于@Rule@ClassRule带注释的字段(如果使用@MockMockitoJUnit4Runner,则带注释的字段@Autowired再次使用SpringJUnitRunner),可以确保在您在JUnit中输入适当的@Before等方法时已对它们进行了初始化。如果您使用的是静态/实例初始化程序块,则没有这样的保证(事实上,有不会的保证)。

答案 1 :(得分:2)

首先要启用声明性编程;使用注解只是JUnit中的“您如何做事”,因此在这里也使用这些结构是很有意义的。

并注意:这也是出于对称性。您有@After@AfterClass,您实际上无法使用该类中的(静态)代码块来表达它们!

答案 2 :(得分:1)

  

@BeforeClass方法在静态初始化程序块运行时运行

重要的警告是此陈述是错误的。静态初始化程序块在加载类时运行,而在您打算执行测试时并不一定如此。

@BeforeClass移动到static-init块中意味着每个类加载仅调用一次,这意味着您必须先重新加载类才能再执行多次测试(这很棘手)。

还必须注意,@BeforeClass并不是要准备要使用的测试类-而是要准备系统的其余部分来运行测试-并且,对于因此,通常每个@BeforeClass@Before都需要分别加上适当的@AfterClass@After进行补充,以便在运行所有测试之后,对系统进行清理。 / p>

答案 3 :(得分:0)

这里是junit 4 javadocs的链接; 每个注释背后的原因都包含在注释的描述中。

直接从JUnit JavaDocs中退出

对于@Before

  

编写测试时,通常会发现多个测试需要先创建类似的对象,然后才能运行。使用@Before注释公共void方法会使该方法在Test方法之前运行。除非超类的@Before方法在当前类中被覆盖,否则它们将在当前类的@Before方法之前运行。没有定义其他顺序。

对于@BeforeClass

  

有时,一些测试需要共享计算量大的设置(例如登录数据库)。尽管这可能会损害测试的独立性,但有时这是必要的优化。用@BeforeClass注释一个公共的静态void no-arg方法会导致它在类中的任何测试方法之前运行一次。超类的@BeforeClass方法将在当前类的方法之前运行,除非它们在当前类中被隐藏。