2013-04-12 56 views
1

检查很多XML字符串,我经常使用ErrorCollector构造。但我仍然不明白它是如何工作的。为什么ErrorCollector在声明时需要分配?

当我宣布一个ErrorCollector,我得马上给它分配:

@Rule 
public ErrorCollector collector= new ErrorCollector(); 

如果我想刷新每次测试前的收藏家,我把分配

collector= new ErrorCollector(); 

在@Before方法。但是,宣言的第一项任务是过度的。但我无法删除它。

这个必须分配的意义是什么?它是如何工作的?我认为,@规则只是关于声明?

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

+0

什么是'test-construction',它为什么适用于这个问题,而'unit-testing'没有? – Charles

回答

3

与JUnit中的大多数/全部@Rule s一样,它们在每次测试前自动为refreshedcleared。因此,您只需将其声明为@Rule就如上面所列。你不需要在你的@Before方法中做任何事情。我们认为这是JUnit会在每次测试之前和之后调用ErrorCollector。在每次测试之前,ErrorCollector可以自行初始化(清除以前存储的任何错误)。每次测试后,如果收集到错误,则会报告错误。

这里是​​

来自备注来源:

必须分配,因为JUnit的必须要有规则的情况下进行工作。否则,该对象将为空。请记住,JUnit代码使用反射来使用@Rule注释获取Object的实例,并使用instanceof来确定它是否是TestRule或MethodRule。我相信@Before方法在声明内,因此该规则被调用

FROM MatthewFarwell后叫:

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

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

谢谢马特!

+0

“在每次测试之前,ErrorCollector可以自行初始化”1.因此,可以还是应该? 2.谢谢,并有+1,但我想了解该@Rule注释的行为。 – Gangnus

+0

1.你不应该在意。关键在于除了将其声明为@规则以外,您不必做任何事情。 2。JUnit使用'@ Rule'注释来标识应该用于包装每个测试方法的'TestRule'实例。 JUnit将每个测试的执行包装在一个'Statement'中,然后为每个找到的'Rule'提供'Statement',以便'Rule'用它自己的定制逻辑封装语句。 –

+0

看来,我明白了,谢谢。但这并不能解释为什么我要在声明中使用赋值。我可以阅读源代码,这不是一个问题。但是我需要阅读哪些源代码 - 这就是问题所在。 – Gangnus

相关问题