java - 允许在子类中扩展静态方法

时间:2015-07-01 10:33:07

标签: java junit java-8

使用JUnit我的所有运行器类都实现了一个用

注释的方法
@BeforeClass
public static void setUp() throws Exception {}

有很多相互代码。

我想创建一个基本运行器,它将包含所有基本代码,并允许子类添加更多功能。

这都是静态的。什么是最佳做法?

3 个答案:

答案 0 :(得分:1)

你应该重新考虑你的设计。 @BeforeClass注释旨在指定必须为所有测试运行一次的代码。如果您在使用static注释的多个@BeforeClass方法中重复相同的代码,换句话说,多次执行相同的操作,则表明它不是您想要的@BeforeClass语义。

也许你只想要用@Before

注释的实例方法

否则,如果它真的是关于单次操作,只需将带有static注释的@BeforeClass方法放入基类中,您就完成了。子类的初始化意味着基类的初始化。对于所有子类,基类的初始化将只发生一次,但这就是@BeforeClass的全部内容。如上所述,如果您希望每个子类初始化一次或每次测试一次,那么@Before更有可能是您想要的功能。

进一步注意,可以在基类中的static方法中包含代码,只有在子类调用它时才会执行。只需将代码放入方法,而不用 @BeforeClass注释。然后,具有或不具有注释的子类中的方法可以调用基类的方法。这里不需要覆盖关系。

答案 1 :(得分:0)

如上所述;静态没有“压倒一切”;当然:静态本身......往往是“需要改进设计”的指示。每个正在编写严肃的单元测试的人都知道静态的东西可以使单元测试成为一个夜晚的母马。因此,我们在生产代码中避免使用 static 。但是,在我们的测试代码中,我们只是使用它?!

更进一步:有些人声称继承不是“我的单元测试中有很多常用代码”的好答案。

例如,请参阅here

答案 2 :(得分:0)

您可以将公共代码移动到规则中,并在每个测试中重用该规则:https://github.com/junit-team/junit/wiki/Rules