【问题标题】:Why does ErrorCollector demands for assignment at the moment of declaration?为什么 ErrorCollector 在声明的时候要求赋值?
【发布时间】:2013-04-12 08:05:32
【问题描述】:

检查许多 XML 字符串,我经常使用 ErrorCollector 构造。但我仍然不明白它是如何工作的。

当我声明一个 ErrorCollector 时,我必须立即分配它:

@Rule
public ErrorCollector collector= new ErrorCollector();

如果我想在每次测试之前刷新收集器,我正在分配一个作业

collector= new ErrorCollector();

在@Before 方法中。但是因此声明处的第一个赋值是多余的。但我无法删除它。

这个必须分配的任务是什么意思?它是如何工作的?我想,@Rule 只是关于声明?

@Matthew Farwell 在What is the logic of @Rule(JUnit) declaration and assignment in a Groovy class 说:“在 Java 中,JUnit 运行器检查 @Rule 注释是否应用于公共非静态字段或公共非静态方法,该方法返回 TestRule 或 MethodRule。”但是这里检查的不是声明,而是赋值,它是在构建和测试构建之后发生的事情?

【问题讨论】:

  • 什么是test-construction,为什么它适用于这个问题,而unit-testing 不适用?

标签: java junit errorcollector


【解决方案1】:

与 JUnit 中的大多数/所有 @Rules 一样,在每次测试之前它们都是 refreshedcleared。因此,您只需将其声明为上面列出的@Rule。您无需在 @Before 方法中对其进行任何操作。我们的想法是,JUnit 将在每次测试之前和之后调用ErrorCollector。在每次测试之前,ErrorCollector 可以自行初始化(清除任何先前存储的错误)。每次测试后,如果收集到错误,它会报告错误。

这里是ErrorCollector的来源

来自评论:

它必须被分配,因为 JUnit 必须有一个规则的实例才能使用。否则该对象将为空。请记住,JUnit 代码使用反射来获取带有 @Rule 注释的 Object 实例,并使用 instanceof 来确定它是 TestRule 还是 MethodRule。我相信 @Before 方法是在语句中调用的,因此是在调用规则之后

来自马修法威尔:

当您运行 JUnit 测试(例如 FooTest)时,运行程序将为每个测试方法创建一个 FooTest 实例。因此,如果您使用 public ErrorCollector collector= new ErrorCollector();如上所述,那么每个测试方法都会自然地重新实例化一次。

结论:确保不要在测试之间保存状态!当然,您不应该这样做,因为无法保证订单。

谢谢马特!

【讨论】:

  • "在每次测试之前,ErrorCollector 可以自行初始化" 1. 那么,可以还是应该? 2. 谢谢,有一个 +1,但我想了解 @Rule 注释的行为。
  • 1.你不应该在乎。关键是除了将其声明为@Rule 之外,您无需执行任何操作。 2. JUnit 使用@Rule 注释来标识应该用于包装每个测试方法的TestRule 实例。 JUnit 将每个测试的执行包装在 Statement 中,然后将 Statement 提供给每个找到的 Rule,以便 Rule 使用自己的自定义逻辑包装语句。
  • 看来,我明白了,谢谢。但这并不能解释为什么我必须在声明语句中使用赋值。我可以阅读源代码,这不是问题。但是我需要阅读哪些源代码 - 这就是问题所在。
  • 它必须被赋值,因为 JUnit 必须有一个规则实例才能使用。否则该对象将为空。请记住,JUnit 代码使用反射来获取带有@Rule 注释的对象实例,并使用instanceof 来确定它是TestRule 还是MethodRule。我相信 @Before 方法是在语句中调用的,因此是在调用规则之后。
  • @JohnB 当您运行 JUnit 测试(例如 FooTest)时,运行程序将为每个测试方法创建一个 FooTest 实例。因此,如果您使用 public ErrorCollector collector= new ErrorCollector();如上所述,那么每个测试方法都会自然地重新实例化一次。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多