3

私は長いパラメーター化されたテストを書きました。そのパラメーターの 1 つは、2D 配列の行ごとに異なるオブジェクトを構築するための二重ブレース構文を使用したコンストラクター呼び出しです。

Object[][] data = new Object[][] {
{ 1, 2, 3, new Blah() {{ setA(); }} }
{ 1, 2, 3, new Blah() {{ setB(); }} }
...

JUnit の哲学は、各 @Test でテスト ケース コンストラクターを呼び出すことであるため、パラメーター化されたテストでも同じことが行われると想定していましたが、そのコンストラクター (パラメーター化されたテスト用に定義されたコンストラクター) のみを呼び出していることがわかります。行ごとに 1 回であり、行ごとのテストごとに 1 回ではありません。

そのため、テスト フィールドはグローバルに動作し、テストは相互に影響しています。通常の JUnit ランナーと同様に、ランナーに各テストのコンストラクターを強制的に呼び出す方法があるかどうかを知りたいです。この場合、Google と JUnit のページは役に立ちません。テスト全体を書き直すのは避けたいと思います。これは、この時点で広範でかなり読みやすいものです。

4

1 に答える 1

1

私が完全にあなたをフォローしているかどうかはわかりませんが、テストが実行されると、次のようになります。

  1. @Parametersメソッドで注釈を付けたメソッドは、一度だけ呼び出されます。
  2. 注釈付きメソッドによって返されるコレクションの行ごとに、テストランナーインスタンスが作成されます。
  3. テスト、コンストラクターを使用してパラメーターコレクションの各行に対してインスタンス化されますが、最初の呼び出しからキャッシュされた対応するパラメーター値の行に渡されます。

こちらこちらをクリックすると、これがどこで発生するかを確認できます。呼び出し間で状態を変更している場合(静的メソッドなどを使用)、奇妙なことが発生することが予想されます。

編集:コードをざっと見てみると、あなたが今何を求めているのかよくわかります。JUnit 4.10を使用してパラメーター化されたテストをデバッグしましたが、実際には、テストごとに行ごとに1回コンストラクターが呼び出されます。

于 2012-09-13T02:27:53.087 に答える