我在使用JUnit编写一些测试用例.我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例.
为此,我可以使用
>静态初始化程序块或
> @BeforeClass的静态方法
使用一个以上的优点是什么?
解决方法
对于@BeforeClass或静态初始化程序,语义非常不同.
静态初始化器由JVM调用,而不是由JUnit调用.如果静态初始化程序中抛出异常,则测试框架可能无法捕获并报告异常.此外,静态初始化器的调用时间与@BeforeClass方法相比没有明确定义.它将仅在其第一次实际使用中的类加载器运行一次,例如访问静态属性,静态方法或其构造函数之一.有时候,很难弄明白这是什么. (如果你不使用继承:你可能有一天或者同事会重构你的测试用例,如果不是今天,静态初始化器的选择可能会在将来引入讨厌的bug)
另一方面,在运行每个类的测试之前运行@BeforeClass.如果一个类将受到不同的测试,例如由于基于继承的测试,静态初始化程序将仅针对使用此类的第一次测试运行.这意味着你根据你的测试顺序取决于你不想要什么.
请注意,两个选项之间的语义差异大于使用@Before或测试的构造函数之间的语义差异.作为最后的论点,考虑注释的纪录片价值.它使您的意图更易读.
这个规则的唯一例外是不变的常量.这些应在其声明内进行初始化,以保持代码简洁,并且为了尊重compile time constants.如果您的值是可变的,那么您根本不应该使用静态值.再次,在测试中改变的可变值引入了对您的测试的顺序依赖性,这是要避免的.
TL; DR:使用@BeforeClass!