为什么ErrorCollector在声明时要求分配?

时间:2013-04-12 08:05:32

标签: java junit errorcollector

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

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

@Rule
public ErrorCollector collector= new ErrorCollector();

如果我想在每次测试之前刷新收集器,我正在进行一项作业

collector= new ErrorCollector();
@Before方法中的

。但因此,宣言的第一项任务是过分的。但是我无法删除它。

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

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

1 个答案:

答案 0 :(得分:3)

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

以下是ErrorCollector

的来源

来自评论:

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

FROM MatthewFarwell:

当您运行JUnit测试(例如,FooTest)时,运行器将为每个测试方法创建一个FooTest实例。所以如果你使用公共的ErrorCollector collector = new ErrorCollector();如上所述,每个测试方法自然会重新实例化一次。

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

谢谢马特!