JUnit4 根据自定义 java 注释跳过测试

2024-04-08

我希望根据我用 Java 创建的自定义注释来执行 JUnit4 测试。此自定义注释的目的是让 JUnit4 注意到,仅当机器的平台与注释中指定的平台匹配时才应运行测试。

假设我有以下注释:

public @interface Annotations {
    String OS();
    ...
}

以及以下测试:

public class myTests{

    @BeforeClass
    public setUp() { ... }

    @Annotations(OS="mac")
    @Test
    public myTest1() { ... }

    @Annotations(OS="windows")
    @Test
    public myTest2() { ... }

    @Annotation(OS="unix")
    @Test
    public myTest3() { ... }

}

如果我要在 Mac 计算机中执行这些测试,则只应执行 myTest1(),其余部分应被忽略。但是,我目前陷入了应该如何实现这一点的困境。如何让 JUnit 读取我的自定义注释并检查是否应该运行测试。


您可以使用类别,也可以实现您自己的自定义 JUnit 运行程序。扩展默认的 JUnit 运行器非常简单,并且允许您定义要以任何您想要的方式运行的测试列表。这包括仅查找具有特定注释的测试方法。我在下面提供了代码示例,您可以将它们用作您自己的实现的基础:

注解:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
   String OS();
}

自定义跑步者类别:

public class MyCustomTestRunner extends BlockJUnit4ClassRunner {

   public MyCustomTestRunner(final Class<?> klass) throws InitializationError {
      super(klass);
   }

   @Override
   protected List<FrameworkMethod> computeTestMethods() {
      // First, get the base list of tests
      final List<FrameworkMethod> allMethods = getTestClass()
            .getAnnotatedMethods(Test.class);
      if (allMethods == null || allMethods.size() == 0)
         return allMethods;

      // Filter the list down
      final List<FrameworkMethod> filteredMethods = new ArrayList<FrameworkMethod>(
            allMethods.size());
      for (final FrameworkMethod method : allMethods) {
         final MyCustomAnnotation customAnnotation = method
               .getAnnotation(MyCustomAnnotation.class);
         if (customAnnotation != null) {
            // Add to accepted test methods, if matching criteria met
            // For example `if(currentOs.equals(customAnnotation.OS()))`
            filteredMethods.add(method);
         } else {
            // If test method doesnt have the custom annotation, either add it to
            // the accepted methods, or not, depending on what the 'default' behavior
            // should be
            filteredMethods.add(method);
         }
      }

      return filteredMethods;
   }
}

测试类示例:

@RunWith(MyCustomTestRunner.class)
public class MyCustomTest {
   public MyCustomTest() {
      super();
   }

   @Test
   @MyCustomAnnotation(OS = "Mac")
   public void testCustomViaAnnotation() {
      return;
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JUnit4 根据自定义 java 注释跳过测试 的相关文章

随机推荐

  • 带 Riverpod 的 Flutter 导航栏

    我尝试管理我的状态 但我真的做不到 我想了解如何使用 Riverpod 包在管理页面底部创建导航栏 我设法管理我们单击的页面 但我不知道如何根据所选按钮返回正确的寻呼机 主要 dart import package flutter mate
  • 使用 Preg_Replace 替换撇号时遇到问题

    我试图从文本中删除撇号 但它并没有真正起作用 一定是一件小事 text preg replace text 这就是我现在用来删除它的方法 我究竟做错了什么 有一系列的方法可以删除特殊字符 将它们转换为网址并将它们存储在我的数据库中 然而 最
  • 如何防止背景图像在更改时闪烁

    我通过 JavaScript 将重复的背景图像从画布应用到 div 如下所示 var img canvas document createElement canvas img canvas width 16 img canvas heigh
  • 如何检查第一个数据帧中的值是否包含或与另一个数据帧中的值匹配

    我在用R处理一些数据框 我的问题与如何检查第一个数据帧中的变量值是否与另一个数据帧中的值匹配有关 这场比赛与其他比赛有很大不同merge or join 我将介绍我的数据框 dput 最后 我的第一个数据框是df1 它包含变量name我想将
  • 使用 AngularJS 在 Chrome 中中断变量更改

    如同this https stackoverflow com questions 11618278 how to break on property change in chrome问题 我想打破 Chrome 中的变量更改 但是 我使用的
  • 使用 chrome.history.deleteRange 未完全删除历史记录

    我写了一个小扩展 使用deleteRange from chrome historyAPI 用于删除开始时间戳和结束时间戳之间的部分浏览器历史记录 chrome history deleteRange startTime startTime
  • 使用C#正则表达式替换XML元素内容

    我正在编写一些处理记录 xml 数据的代码 并且我希望能够替换文档中某些元素 例如密码 的内容 我不想序列化和解析文档 因为我的代码将处理各种模式 输入文档示例 doc 1
  • 虚拟主机无法在 zend 框架中工作

    以下是我在 etc apache2 sites available 中的虚拟主机
  • 实体框架 6.1:字典中不存在给定的键

    我有一个带有一些关系的表 程序工作正常 直到我在该表和customer表 ddlPermissionCode表 第一表 如下 CREATE TABLE dbo PermissionCode Id int NOT NULL IDENTITY
  • Flutter 在选择时更改 TabItem 背景

    我想问一下 选择选项卡时如何更改选项卡项目背景颜色 抱歉 我是颤振的新手 使用底部标签栏还是标签栏更好 像这样 我的代码 bottomNavigationBar new TabBar tabs Tab icon new Icon Icons
  • 如何找到二维数组JAVA中元素的平均值? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要以下程序的帮助 编写一个方法 将二维双精度数组作为输入参数并返回数组元素的平均值 谁能告诉我该怎么做 我当前的代码 public
  • 通过 Slack API 发送命令

    有没有办法以编程方式发送command通过 API 到 Slack 我已成功发布消息 var postingResponse client UploadValues https slack com api chat postMessage
  • Android GPS 的准确度如何? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我好像在某处读过Android的GPS精度约为10厘米 任何人都可以验证或更正这个吗 原因是我正在尝试开发的应用程序会跟踪用户访问过的位置 这将极大地
  • 谷歌地图圆圈与标签

    我使用 google 地图 api 创建了地图视图 通过使用 google maps Circle 圆圈在地图上打印 将标记更改为圆圈 没有任何问题 但我无法在其中添加标签或文本 我该如何解决这个问题 这是我用来打印圆圈的代码 functi
  • 如何使用 fetch api 及其 javascript 加载 html 页面?

    我正在尝试使用 fetch API 加载 HTML 页面及其 JavaScript 脚本 我可以使用 ajax 和 JQuerySee here https stackoverflow com questions 50847274 fetc
  • NSUTF8StringEncoding 导致文件在 TextEdit/Pages 中渲染不正确,但在 BBEdit/vi 中则不会

    我遇到了一个有点奇怪的问题 每当我在 iOS 应用程序中创建新的文本文件时 我都会将其编码设置为NSUTF8StringEncoding 如果我编辑文件并输入任何带变音符号的字符并保存更改 则变音符号在某些应用程序 如 BBEdit Tex
  • 具有核心动画页面和长列表的聚合物芯片到卡图案

    一般来说 我发现很难使用core animated pages当我有一个滚动页面的很长列表时 聚合物元素可实现芯片列表到卡片类型模式 我认为困难在于 一旦过渡完成 隐藏部分就会从布局中取出 我很难找到解决这个问题的方法 简单的插图 JSFi
  • “Josephus-p‌r‌o‌b‌l‌e‌m” 在 python 中使用列表

    我想知道是否可以使用 python 中的列表来解决约瑟夫问题 简单来说 约瑟夫问题就是在圆形排列中找到一个位置 如果使用事先已知的跳过参数来处理执行 那么该位置将是安全的 例如 给定一个圆形排列 例如 1 2 3 4 5 6 7 并且ski
  • 无法使用 mailto uri 创建具有多个收件人的新邮件

    我正在使用创建一个Windows 8 1 应用商店 in WinRT 我无法通过用逗号或分号分隔每封电子邮件来使用 mailto uri 创建具有多个收件人的新邮件 两者都会给我相同的错误 Invalid URI The hostname
  • JUnit4 根据自定义 java 注释跳过测试

    我希望根据我用 Java 创建的自定义注释来执行 JUnit4 测试 此自定义注释的目的是让 JUnit4 注意到 仅当机器的平台与注释中指定的平台匹配时才应运行测试 假设我有以下注释 public interface Annotation