请教JUnit5文档中@Test注解相关语句‘Such methods are inherited unless they are overridden’的含义
理解JUnit5中@Test注解的方法继承规则
这句话其实是在明确被@Test标记的测试方法的继承行为,翻译成直白的话就是:父类里用@Test注解的测试方法,会被子类继承过来,自动成为子类的测试用例——但如果子类重写了这个方法,那父类的版本就不会在子类的测试流程中生效了。
我给你举两个具体的代码例子,一看就明白:
场景1:子类未重写父类测试方法
先定义一个父类测试类:
public class BaseTestCase { @Test void verifyBaseFunctionality() { System.out.println("执行父类的基础功能测试"); } }
然后子类直接继承这个父类,不做任何重写:
public class SubTestCase extends BaseTestCase { // 没有重写父类的verifyBaseFunctionality方法 }
当你运行SubTestCase的测试时,JUnit5会自动执行继承来的verifyBaseFunctionality方法——这就是官方说的“Such methods are inherited”的实际表现。
场景2:子类重写父类测试方法
如果子类重写了这个测试方法:
public class SubTestCase extends BaseTestCase { @Override void verifyBaseFunctionality() { System.out.println("执行子类重写后的方法"); } }
这时候运行SubTestCase的测试,你会发现没有任何测试方法被执行。原因是:子类的重写行为阻断了父类测试方法的继承(也就是“unless they are overridden”的含义),而子类重写后的方法没有添加@Test注解,所以不被JUnit视为测试用例。
如果子类重写时也加上@Test注解:
public class SubTestCase extends BaseTestCase { @Override @Test void verifyBaseFunctionality() { System.out.println("执行子类的定制化测试"); } }
这时候运行SubTestCase,只会执行子类重写后的测试方法,父类的原测试方法不会被触发。
补充说明
其实这个规则本质上是Java方法继承逻辑在JUnit测试中的延伸:当子类重写父类方法后,子类实例调用该方法时只会执行子类的版本,JUnit的测试引擎自然也遵循这个逻辑,不会去执行父类被重写的测试方法。官方文档没有过多展开,可能是默认开发者已经了解Java的继承机制~
内容的提问来源于stack exchange,提问作者Guizhou Feng
相关产品推荐
相关产品推荐

