【问题标题】:Run startup code on any entry point在任何入口点运行启动代码
【发布时间】:2014-09-12 11:49:33
【问题描述】:

有没有什么方法可以确保某些代码在启动时运行而不管程序使用什么入口点?

例如,我的程序在其主入口点的静态初始化程序中有一些代码,用于检查断言是否启用。由于集成测试在没有启用断言的情况下运行,我们有一些未捕获的错误。静态初始化程序没有捕捉到这一点,因为它仅在加载该特定类时运行。

那么有没有办法制作“程序初始化器”:程序启动时始终运行的代码?

我可以创建一些每个入口点都必须调用的静态方法,但这意味着每个单独的测试也必须调用它(因为每个单元测试都是一个入口点)。这看起来相当混乱(很容易忘记添加它,增加了很多混乱等等)。

有没有更好的解决方案?

【问题讨论】:

  • 这听起来像是您的测试套件中的一个错误。修复它并继续前进。除非你为每个使用断言的类添加一个静态初始化器——不,我看不到这样做的方法。
  • 您的测试的顶级Suite 中的@BeforeClass 怎么样?还是无论入口点是什么都加载的类,某种应用程序上下文?
  • @markspace,测试套件确实有一个错误。然而,直到很晚才发现它,因为我们不小心在禁用断言的情况下运行测试(Java 的默认设置)。确保断言启用(或严重崩溃)的代码有助于避免将来犯此错误。

标签: java


【解决方案1】:

您可以使用@BeforeClass 之类的东西,它就像您的测试类的静态初始化程序。它会在一开始就运行一次。

【讨论】:

  • 但这仅适用于单个班级。这意味着到目前为止,我们拥有 135 个测试类的每个测试类都需要另一种方法。我不确定这种混乱是否值得。
  • 有测试套件,正如@A4L 提到的那样,但是我们必须为我们所有的测试创建一个套件并维护这个测试列表(我们目前只创建一个测试文件真的很方便和 Maven 弄清楚如何运行它)。我不确定我正在寻找的东西是否可以使用香草 Java。 Frameworks like Tomcat 似乎有这样的东西,但我认为没有任何 Java 应用程序的等价物。
  • 测试套件就是这样。拥有一个带有@BeforeClass 方法的超类以及扩展这个超类的所有测试类怎么样?显然涉及不需要的继承层次结构,但它对你有用吗?我自己没有尝试过,但我认为测试服无论如何都是比这个更好的选择。
  • 我接受这个答案。我最终决定不去实现它(这没什么大不了的——Maven和Jenkins默认有断言),但它回答了这个问题(尽管我承认不是我希望的答案)。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2023-02-06
  • 2018-03-15
  • 1970-01-01
  • 2015-02-08
相关资源
最近更新 更多