java - 强制 JUnit 子类测试覆盖 @BeforeClass 方法

标签 java junit parameterized-tests

我有一个作为 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/

相关文章:

具有 Maven 依赖的 Java ClassNotFoundException

java - 无法在 JUnit 中实例化测试用例

java - 如何使用Junit测试对象是否被修改?

java - 如何使用@csvsource更改junit参数化测试的csvparsersettings

java - 如何以稳健的方式处理kafka发布失败

java - Android Java Activity 显示哪个 Fragment 可见

java - 组合框中的 ScrollBar 显示最后一个条目 javax.swings.JScrollbar[,0,0]

java - 模拟链调用涉及 Java 中的 Stream

android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>

robotframework - Robot Framework 是否支持 Gherkin 数据表?