java – @BeforeClass vs static {}

我在使用JUnit编写一些测试用例.我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例.

为此,我可以使用

>静态初始化程序块或
> @BeforeClass的静态方法

使用一个以上的优点是什么?

解决方法

对于@BeforeClass或静态初始化程序,语义非常不同.

静态初始化器由JVM调用,而不是由JUnit调用.如果静态初始化程序中抛出异常,则测试框架可能无法捕获并报告异常.此外,静态初始化器的调用时间与@BeforeClass方法相比没有明确定义.它将仅在其第一次实际使用中的类加载器运行一次,例如访问静态属性,静态方法或其构造函数之一.有时候,很难弄明白这是什么. (如果你不使用继承:你可能有一天或者同事会重构你的测试用例,如果不是今天,静态初始化器的选择可能会在将来引入讨厌的bug)

另一方面,在运行每个类的测试之前运行@BeforeClass.如果一个类将受到不同的测试,例如由于基于继承的测试,静态初始化程序将仅针对使用此类的第一次测试运行.这意味着你根据你的测试顺序取决于你不想要什么.

请注意,两个选项之间的语义差异大于使用@Before或测试的构造函数间的语义差异.作为最后的论点,考虑注释的纪录片价值.它使您的意图更易读.

这个规则的唯一例外是不变的常量.这些应在其声明内进行初始化,以保持代码简洁,并且为了尊重compile time constants.如果您的值是可变的,那么您根本不应该使用静态值.再次,在测试中改变的可变值引入了对您的测试的顺序依赖性,这是要避免的.

TL; DR:使用@BeforeClass!

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...