【问题标题】:Java JUnit array of classes for SuiteClasses syntaxSuiteClasses 语法的 Java JUnit 类数组
【发布时间】:2012-11-14 14:47:03
【问题描述】:

目前我有以下代码来测试我的课程...

@RunWith(Suite.class)
@SuiteClasses( { MyClass.class, MyNewClass } )
public class AllTests {
    public static void suite() {        
    }
}

我想做的是以下内容,但它在语法上不正确 - 正确的格式是什么?...

 Class<?>[] classArray = new Class<?>[] {
        MyClass.class, MyNewClass.class
  };

 @RunWith(Suite.class)
    @SuiteClasses( classArray  )
    public class AllTests {
        public static void suite() {        
        }
    }

【问题讨论】:

  • 尝试删除通用 >

标签: java generics junit


【解决方案1】:

很遗憾,你不能。注解需要带编译时常量,所以必须使用{ MyClass.class, MyNewClass.class }

【讨论】:

  • 这是正确答案。这是关于你提供给注解的内容,而不是你声明数组变量的方式。
【解决方案2】:

--- 更新---

问题似乎源于注释。注释需要编译时常量,这意味着您不能以可能需要重新分配数组或在注释方法可以访问它之前对其进行修改的方式“构建一个数组”类。

感谢 artbristol 指出了显而易见的事实。最初我走错了路,试图找出你的数组为什么在我的 1.7 环境中编译。

实际上,当考虑到 Annotations 旨在通过 声明性 方式扩展 java 编程时,对 Annotations 的编译时间常数限制非常有意义。

--- 原帖---

不要尝试使用通配符,而是使用

 Class<Object>[] classArray = new Class<Object>[] { .... };

它半破坏了泛型的目的,因为一切都从 Object 扩展而来;但是,它将满足您需要的“将任何东西塞入其中”的要求。

【讨论】:

    【解决方案3】:

    K.Sierra 来自“SCJP 学习指南”: “请记住,通配符只能用于引用声明 (包括参数、变量、返回类型等)。它们不能用作 创建新的类型化集合时的类型参数。想一想——虽然 引用可以是抽象的和多态的,创建的实际对象必须是 具体类型。”

    List<?> foo = new ArrayList<? extends Animal>();
    

    问题:您不能在对象创建中使用通配符表示法。所以 new ArrayList() 不会编译。

    编辑: @artbristol 指出了另一个问题,即传递给注释的编译时常量。查看此线程中的响应,它们可能会有所帮助。其中一个建议将 ENUM 作为一种解决方法。 How to use an array constant in an annotation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多