我有一个作为 JUnit 抽象测试编写的轻量级测试框架。我想做的是让每个实现子类定义其自定义测试类设置。我的计划是让抽象父类(super class)定义一个 @BeforeClass
方法,该方法调用每个子类都必须定义的抽象设置方法,但这会失败,因为 @BeforeClass
方法必须是静态的,静态方法不能抽象,也不能调用实例方法。
我可以假设子类将通过包含文档中所需的内容或抛出 IllegalStateException
来完成设置,但我真的希望能够在接口(interface)级别强制执行此设置有很多原因。有人能想到解决这个问题的方法吗?
顺便说一句,我在使这些测试参数化时遇到了同样的问题(子类定义参数,但 @Parameters 注解的方法必须是静态的)。我通过使用允许方法级别参数的第三方 JUnitParams 运行程序来解决这个问题。在这里查看:https://github.com/Pragmatists/JUnitParams
最佳答案
一种选择是让子类实现静态 doSetupOnce()
方法,并从基类 @BeforeClass
方法反射地查找并调用该方法。由于这需要是一个静态方法,因此它的存在只能在运行时强制执行。
另一种方法是在基类中使用一个抽象的 doSetupOnce
实例方法,该方法在第一次调用父级的 @Before
方法时被调用。这会在编译时强制执行该问题,但随后实现者必须小心,不要从此方法访问实例字段(因为这可能不是他们想要的)。
一般来说(并且不知道您的具体情况),我不太喜欢这两种方法,并且宁愿让实现者来声明 @BeforeClass
方法,如果需要。将它们锁定在严格的基类方案中可能会导致比它解决的问题更多的问题。还要考虑使用 JUnit 规则,这通常是比基类更好的选择(例如,因为它们是可组合的)。当然,您也可以将这两种方法结合起来,主要依靠 JUnit 规则,另外提供一些带有预定义规则的基类以方便使用。
关于java - 强制 JUnit 子类测试覆盖 @BeforeClass 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821980/