You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit继承父单元测试类时如何忽略父类带@Test注解的测试用例

解决方案

以下是不同场景下可落地的实现方案,按推荐优先级排序:

方案1:重构测试类层级(最优,无副作用)

将通用的setup、teardown、stubbing逻辑从原有MyBaseClass中抽离为抽象测试基类,JUnit不会执行抽象类中的任何测试用例,完全规避父类用例执行的问题,同时完全保留你需要复用的所有逻辑,不需要拆分紧耦合的stub代码。

代码示例

  1. 新增抽象公共基类:
@SpringBootTest
@ContextConfiguration
@ExtendWith(MockitoExtension.class)
@AutoConfigureMockMvc
public abstract class AbstractCommonTestBase extends TestBase {
   @Value("${test.foo}")
   private String foo;

   // 所有通用的setup、teardown、stubbing逻辑全部迁移到这里
   // 不要添加任何@Test注解的测试方法
}
  1. 原有V1测试类调整继承关系:
public class MyBaseClass extends AbstractCommonTestBase {
   // 保留原有的V1版本所有@Test测试用例即可,不需要修改其他逻辑
}
  1. 新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标签的用例即可:

  1. 父类用例加标签:
@Test
@Tag("v1")
public void testV1GetEndpoint() {
   // 原有逻辑
}
  1. 配置过滤规则:
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:06:01