2

多くの XML 文字列をチェックして、ErrorCollector 構造を頻繁に使用します。しかし、それでも私はそれがどのように機能するのか理解していません。

ErrorCollector を宣言するときは、すぐに割り当てる必要があります。

@Rule
public ErrorCollector collector= new ErrorCollector();

すべてのテストの前にコレクターを更新したい場合は、割り当てを入れています

collector= new ErrorCollector();

@Before メソッドで。しかし、このように、宣言での最初の代入は過剰です。しかし、私はそれを削除することはできません。

この必須課題の意味は何ですか? そして、それはどのように機能しますか?@Rule は宣言のみに関するものだと思いましたか?

@Matthew Farwellの @Rule(JUnit) 宣言のロジックと Groovy クラスでの割り当ては次のように述べていますTestRule または MethodRule のいずれかを返します。」しかし、ここでチェックされるのは宣言ではなく、割り当てであり、構築とテスト構築の両方の後に発生するものですか?

4

1 に答える 1

4

JUnit のほとんど/すべて@Ruleの s と同様に、それらは各テストの前refreshedまたは前に自動的に実行されます。したがって、上記のようclearedに として宣言するだけです。メソッド@Ruleで何もする必要はありません。@Beforeこれは、JUnit がErrorCollector各テストの前後に呼び出されると考えることができます。各テストの前に、ErrorCollectorは自身を初期化できます (以前に保存されたエラーをクリアします)。各テストの後、エラーが収集された場合、エラーが報告されます。

ErrorCollectorのソースは次のとおりです。

コメントから:

JUnit は処理するルールのインスタンスを持っている必要があるため、これを割り当てる必要があります。それ以外の場合、オブジェクトは null になります。JUnit コードはリフレクションを使用して @Rule アノテーションを付けたオブジェクトのインスタンスを取得し、instanceof を使用してそれが TestRule か MethodRule かを判断していることを思い出してください。@Before メソッドはステートメント内で呼び出されるため、ルールが呼び出された後に呼び出されると思います

MatthewFarwell から:

FooTest などの JUnit テストを実行すると、ランナーはテスト メソッドごとに FooTest のインスタンスを作成します。したがって、 public ErrorCollector コレクターを使用している場合は、 new ErrorCollector(); 上記のように、これはテストメソッドごとに 1 回自然に再インスタンス化されます。

結論: テスト間で状態を保存しないように注意してください! もちろん、順序が保証されていないため、とにかくそれを行うべきではありません。

ありがとうマット!

于 2013-04-12T10:25:36.593 に答える