我正在使用JUnit编写一些测试用例.我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例.
为此我可以使用其中之一
@BeforeClass使用一个在另一个上有什么好处?
Raf*_*ter 21
@BeforeClass或者static初始化器有很多不同的语义.
静态初始化程序由JVM调用,而不是由JUnit调用.如果在静态初始化程序中抛出异常,则测试框架可能无法捕获并报告异常.此外,与@BeforeClass方法相比,静态初始化器的调用时间没有明确定义.它在第一次实际使用时每个类加载器只运行一次,例如访问静态属性,静态方法或其构造函数之一.有时,可能很难弄清楚这是什么时候.(如果你不使用继承:你可能有一天或某个同事会重构你的测试用例.如果不是今天,选择静态初始化器可能会在未来引入令人讨厌的错误.)
另一方面,@BeforeClass在每个类的测试运行之前运行.如果一个类会受到不同的测试,例如由于继承构建的测试,static初始化程序将仅使用此类运行第一次测试.这意味着您使测试订单依赖于您从未想要的东西.
请注意,两个选项之间的语义差异大于使用@Before或测试的构造函数之间的语义差异.作为最后的论点,考虑一下注释的纪录价值.它使您的意图更具可读性.
此规则的唯一例外是不可变常量.这些应该在他们的声明中初始化,以保持你的代码简洁,并尊重编译时常量.但是,如果您的值是可变的,则根本不应使用static值.同样,在测试中更改的可变值会为您的测试引入顺序依赖性,这是应该避免的.
TL; DR:使用@BeforeClass!