微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – @BeforeClass vs static {}

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

为此,我可以使用

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

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

解决方法

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

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

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

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

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

TL; DR:使用@BeforeClass!

原文地址:https://www.jb51.cc/java/126479.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐