为什么不使用这些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");
}
}
答案 0 :(得分:2)
如果您的测试用例不需要@Before
等提供的附加功能,那么您当然可以自由使用它们。
由于您不能使用这些结构与@After
和@AfterClass
做相同的事情,因此对称,可重用和易读性将它们包括在相同的格式。
此外,对于@Rule
和@ClassRule
带注释的字段(如果使用@Mock
或MockitoJUnit4Runner
,则带注释的字段@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方法将在当前类的方法之前运行,除非它们在当前类中被隐藏。