检查许多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的公共非静态方法。”但是这里检查的不是声明,而是赋值,它是在构建和测试构建之后发生的事情吗?答案 0 :(得分:3)
与JUnit中的大多数/所有@Rule
一样,每次测试前它们都是refreshed
或cleared
。因此,您只需将其声明为上面列出的@Rule
即可。您不需要在@Before
方法中对其执行任何操作。我们想到的是JUnit将在每次测试之前和之后调用ErrorCollector
。在每次测试之前,ErrorCollector
可以初始化自己(清除以前存储的任何错误)。每次测试后,如果收集到错误,则报告错误。
来自评论:
必须分配它,因为JUnit必须具有要使用的规则的实例。否则该对象将为null。请记住,JUnit代码使用反射来获取带有@Rule注释的Object实例,并使用instanceof来确定它是TestRule还是MethodRule。我相信在声明中调用@Before方法,因此在调用规则之后
FROM MatthewFarwell:
当您运行JUnit测试(例如,FooTest)时,运行器将为每个测试方法创建一个FooTest实例。所以如果你使用公共的ErrorCollector collector = new ErrorCollector();如上所述,每个测试方法自然会重新实例化一次。
结论:确保在测试之间不保存状态!当然,你不应该这样做,因为订单不能保证。
谢谢马特!