如何在JUnit4的@RunWith()中使用多个运行器类?
JUnit4集成测试同时使用SpringRunner和RunIfRunner的解决方案
JUnit4不允许在同一个测试类上标记多个@RunWith,以下两种方式可实现两者功能叠加,同时满足你必须使用指定条件执行方案的要求:
方式一:RunIfRunner作为主运行器,委托SpringRunner执行
RunIfRunner本身支持指定委托运行器,将SpringRunner设为它的委托,就能同时实现条件判断和Spring上下文加载:
import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringRunner; import com.github.mjeanroy.junit4.runif.RunIf; import com.github.mjeanroy.junit4.runif.RunIfRunner; @RunWith(RunIfRunner.class) // 指定条件判断类,同时将SpringRunner设为委托运行器 @RunIf( condition = YourCustomCondition.class, runner = SpringRunner.class ) @SpringBootTest // 根据测试场景替换为@ContextConfiguration等Spring测试注解 public class YourIntegrationTest { // 测试方法编写在此 } // 自定义条件判断类,实现Condition接口 class YourCustomCondition implements com.github.mjeanroy.junit4.runif.conditions.Condition { @Override public boolean matches() { // 编写条件判断逻辑,返回true则执行测试,false则跳过 return true; } }
方式二:不依赖@RunWith,用Rule机制实现条件判断
若想保留@RunWith(SpringRunner.class)作为主运行器,可使用RunIfRule替代RunIfRunner的功能,这是JUnit4规则机制的标准用法:
import org.junit.Rule; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringRunner; import com.github.mjeanroy.junit4.runif.RunIfRule; import com.github.mjeanroy.junit4.runif.conditions.Condition; @RunWith(SpringRunner.class) @SpringBootTest public class YourIntegrationTest { // 声明RunIfRule,传入自定义条件类 @Rule public RunIfRule runIfRule = new RunIfRule(new YourCustomCondition()); // 测试方法编写在此 } class YourCustomCondition implements Condition { @Override public boolean matches() { // 条件判断逻辑 return true; } }
关键说明
- 两种方式均完全符合你指定的条件执行方案要求
- 确保你的
junit-runif依赖版本支持上述特性(该库主流版本均已支持)
内容的提问来源于stack exchange,提问作者Dhanyaa Bharadwaj
相关产品推荐
相关产品推荐

