千家信息网

JUnit4中如何扩展Runner

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,JUnit4中如何扩展Runner,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在使用JUnit的过程中,大家可能会对JUnit进行
千家信息网最后更新 2026年11月02日JUnit4中如何扩展Runner

JUnit4中如何扩展Runner,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在使用JUnit的过程中,大家可能会对JUnit进行一些扩展。本文中的示例为JUnit4定义了一个新的Annotation,并相应地对已有的Runner进行扩展,使其能够解析新引入的Annotation。

臆造一个示例,会在执行单元测试方法之前,自动地为单元测试方法打印日志。该示例会为JUnit定义一个新的Annotation用于指定要打印的日志内容,并对JUnit默认提供的Runner实现BlockJUnit4ClassRunner进行扩展,使其能够识别这个新的Annotation。

1. 定义Annotation

TestLogger是一个作用于方法的Annotation,它只有一个属性,用于指定日志的内容,其代码如下所示,

@Target({ ElementType.METHOD })  @Retention(RetentionPolicy.RUNTIME)  public @interface TestLogger {  public String log() default "";  }

2. 扩展Runner

JUnit提供了若干个Runner的实现,如BlockJUnit4ClassRunner,Suite,其中BlockJUnit4ClassRunner用来执行单个测试用例类。LoggedRunner将扩展BlockJUnit4ClassRunner,覆写其中的methodBlock()方法。新的methodBlock()方法会在一开始试图获取被执行测试方法中的TestLogger Annotation,如果存在的话,就会打印出指定的日志,每行日志以当时的执行时间与完整方法名作为前缀。该类的代码如下所示,

public class LoggedRunner extends BlockJUnit4ClassRunner {   private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");   public LoggedRunner(Class klass) throws InitializationError {  super(klass);  }   @Override protected Statement methodBlock(FrameworkMethod method) {  Method classMethod = method.getMethod();  TestLogger loggerAnnotation = classMethod.getAnnotation(TestLogger.class);  if (loggerAnnotation != null) {  StringBuilder log = new StringBuilder(format.format(new Date()));  log.append(" ").append(classMethod.getDeclaringClass().getName())  .append("#").append(classMethod.getName()).append(": ")  .append(loggerAnnotation.log());  System.out.println(log.toString());  }  return super.methodBlock(method);  }  }

3. 应用程序

Calculator是一个简单的应用程序,其中定义了一个除法方法,代码如下所示,

public class Calculator {  public int divide(int a, int b) {  return a / b;  }  }

4. 单元测试程序

CalculatorTest是一个简单的单元测试程序,它会使用两种方式对Calculator中的divide()方法进行单元测试。其代码如下所示,

@RunWith(LoggedRunner.class)  public class CalculatorTest {   private static Calculator calculator = null;   @BeforeClass public static void createCalculator() {  calculator = new Calculator();  }   @Test @TestLogger(log = "a simple division.")  public void simpleDivide() {  int value = calculator.divide(8, 2);  Assert.assertTrue(value == 4);  }   @Test(expected = ArithmeticException.class)  @TestLogger(log = "divided by zero, and an ArithmeticException thrown.")  public void dividedByZero() {  calculator.divide(8, 0);  }  }

值得注意的是,CalculatorTest特别指定LoggedRunner作为测试执行器(@RunWith(LoggedRunner.class));同时,每个单元测试方法,simpleDivide()与dividedByZero(),都使用了Annotation TestLogger,为其指定日志内容。当执行上述单元测试时,会自动地打印出如下形式的日志内容:

2011-12-13_23:48:38_218 test.CalculatorTest#simpleDivide: a simple division2011-12-13_23:48:38_218 test.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown.

5. 小结

通过对BlockJUnit4ClassRunner的扩展,可以让JUnit在运行测试用例时做一些额外的工作。但这种直接修改默认Test Runner的方式并不被提倡,在下一篇文章中将会介绍使用Test Rule来达到相同的扩展目的。

关于JUnit4中如何扩展Runner问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

方法 测试 单元 日志 内容 代码 程序 示例 问题 应用程序 方式 更多 篇文章 帮助 应用 解答 易行 相同 简单易行 中将 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 北京路客互联网科技有限公司 中国互联网科技工作委员会毛军 上海喔噻互联网科技 易通互联网络科技有限公司 滨湖区互联网智能科技产品供应 深圳国际航运科技和互联网 互联网科技热点资讯 中国航天科技大学国际工业互联网 玉溪互联网科技怎么选 天津腾达互联网科技有限公司 畅思互联网科技 东莞新华互联网科技学校 雨阳互联网卡科技有限公司 互联网科技接地气 杭州融税互联网科技有限公司 亚光科技低轨卫星互联网 数字科技和互联网金融哪个好 互联网科技大佬云集 互联网 科技节活动 微视频大赛 互联网佳科技有限公司 深圳互联网科技公司 互联网科技小贷 有木互联网科技 互联网科技视频素材 哈尔滨屹滨互联网科技有限公司 坤平互联网科技 广州富喜互联网络科技 唯美互联网科技 美国五大互联网科技公司市值多少
0