JUnit继承父单元测试类时如何忽略父类带@Test注解的测试用例
解决方案
以下是不同场景下可落地的实现方案,按推荐优先级排序:
方案1:重构测试类层级(最优,无副作用)
将通用的setup、teardown、stubbing逻辑从原有MyBaseClass中抽离为抽象测试基类,JUnit不会执行抽象类中的任何测试用例,完全规避父类用例执行的问题,同时完全保留你需要复用的所有逻辑,不需要拆分紧耦合的stub代码。
代码示例
- 新增抽象公共基类:
@SpringBootTest @ContextConfiguration @ExtendWith(MockitoExtension.class) @AutoConfigureMockMvc public abstract class AbstractCommonTestBase extends TestBase { @Value("${test.foo}") private String foo; // 所有通用的setup、teardown、stubbing逻辑全部迁移到这里 // 不要添加任何@Test注解的测试方法 }
- 原有V1测试类调整继承关系:
public class MyBaseClass extends AbstractCommonTestBase { // 保留原有的V1版本所有@Test测试用例即可,不需要修改其他逻辑 }
- 新V2测试类直接继承抽象基类:
public class MyVersion2BaseClass extends AbstractCommonTestBase { // 只写V2版本的@Test测试用例,不会执行到V1的任何用例 }
方案2:重写父类测试方法加禁用注解(适合父类测试方法少的场景)
如果不想调整原有测试类的层级结构,可以在子类中重写父类所有带@Test注解的方法,加上@Disabled(JUnit5)或@Ignore(JUnit4)注解,运行子类测试时会自动跳过这些方法。
代码示例
@SpringBootTest @ContextConfiguration @ExtendWith(MockitoExtension.class) @AutoConfigureMockMvc public class MyVersion2BaseClass extends MyBaseClass { // 重写父类所有@Test方法,加@Disabled注解 @Disabled @Test public void testV1GetEndpoint() {} @Disabled @Test public void testV1PostEndpoint() {} // 下方编写V2版本的测试用例 }
方案3:标签过滤(适合需要灵活切换用例执行范围的场景)
给父类所有V1的测试用例加上@Tag("v1")注解,在测试执行配置中排除v1标签的用例即可:
- 父类用例加标签:
@Test @Tag("v1") public void testV1GetEndpoint() { // 原有逻辑 }
- 配置过滤规则:
- IDE运行配置中添加测试标签排除规则,排除
v1标签 - Maven的
maven-surefire-plugin插件添加配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludedGroups>v1</excludedGroups> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

