检查很多 XML 字符串,我经常使用 ErrorCollector 构造。但我仍然不明白它是如何工作的。
当我声明一个 ErrorCollector 时,我必须立即分配它:
@Rule
public ErrorCollector collector= new ErrorCollector();
如果我想在每次测试前刷新收集器,我会进行分配
collector= new ErrorCollector();
在@Before 方法中。但是因此声明中的第一个分配是过多的。但我无法删除它。
这个 must-to-be-assignment 的意义是什么?它是如何工作的?我想,@Rule 只是关于声明?
@Matthew Farwell What is the logic of @Rule(JUnit) declaration and assignment in a Groovy class说“在 Java 中,JUnit 运行程序检查 @Rule 注释是否应用于返回 TestRule 或 MethodRule 的公共(public)非静态字段或公共(public)非静态方法。”但是这里检查的不是声明,而是赋值,它是在构建和测试构建之后发生的事情?
最佳答案
与 JUnit 中的大多数/所有 @Rule
一样,它们会在每次测试前自动刷新
或清除
。因此,您只需将其声明为上面列出的 @Rule
。你不需要在你的 @Before
方法中对它做任何事情。我们认为 JUnit 会在每次测试前后调用 ErrorCollector
。在每次测试之前,ErrorCollector
可以自行初始化(清除任何先前存储的错误)。每次测试后,如果收集到错误,它就会报告错误。
这是 ErrorCollector 的来源
来自评论:
它必须被分配,因为 JUnit 必须有一个规则实例才能使用。否则该对象将为空。请记住,JUnit 代码使用反射来获取带有 @Rule 注释的 Object 实例,并使用 instanceof 来确定它是 TestRule 还是 MethodRule。我相信 @Before 方法是在语句中调用的,因此在调用规则之后
来自马修法威尔:
当您运行 JUnit 测试(例如 FooTest)时,运行程序将为每个测试方法创建一个 FooTest 实例。所以如果你使用 public ErrorCollector collector= new ErrorCollector();如上所述,然后每个测试方法自然重新实例化一次。
结论:确保您不在测试之间保存状态!当然,无论如何您都不应该这样做,因为不能保证顺序。
谢谢马特!
关于java - 为什么 ErrorCollector 在声明的时候要求赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966146/