2

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

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

@Rule
public ErrorCollector collector= new ErrorCollector();

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

collector= new ErrorCollector();

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

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

@Matthew Farwell 在什么是 Groovy 类中 @Rule(JUnit) 声明和赋值的逻辑说“在 Java 中,JUnit 运行器检查 @Rule 注释是否应用于公共非静态字段或公共非静态方法它返回一个 TestRule 或 MethodRule。” 但是这里检查的不是声明,而是分配,它是在构建和测试构建之后发生的事情?

4

1 回答 1

4

与 JUnit 中的 most / all 一样@Rule,它们在每个测试之前refreshed或之前自动进行。cleared因此,您只需将其声明为@Rule上面列出的 a 即可。@Before你不需要在你的方法中对它做任何事情。我们的想法是,JUnit 将ErrorCollector在每次测试之前和之后调用。在每次测试之前,ErrorCollector可以初始化自身(清除任何先前存储的错误)。每次测试后,如果收集到错误,它会报告错误。

这是ErrorCollector的来源

来自评论:

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

从马修法威尔:

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

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

谢谢马特!

于 2013-04-12T10:25:36.593 回答