[解決済み] ベストプラクティス。JUnitクラスのフィールドを初期化するのはsetUp()の中か、それとも宣言時か?
質問
クラスフィールドは、このように宣言時に初期化する必要があるのでしょうか?
public class SomeTest extends TestCase
{
private final List list = new ArrayList();
public void testPopulateList()
{
// Add stuff to the list
// Assert the list contains what I expect
}
}
それともsetUp()でこのように?
public class SomeTest extends TestCase
{
private List list;
@Override
protected void setUp() throws Exception
{
super.setUp();
this.list = new ArrayList();
}
public void testPopulateList()
{
// Add stuff to the list
// Assert the list contains what I expect
}
}
私は最初のフォームを使うことが多いのですが、これはより簡潔で、最終フィールドを使用することができるからです。 もし私が が必要でなければ を使用する必要がない場合でも、setUp() メソッドを使用する必要がありますか?
明確化します。
JUnitはテストクラスはテストメソッドごとに1回インスタンス化します。 つまり
list
はどこで宣言したかにかかわらず、 テストごとに一度だけ作成されることになります。 また、テスト間に時間的な依存性がないことも意味します。 ということで、setUp()を使うメリットはなさそうです。 しかし、JUnit FAQにはsetUp()で空のコレクションを初期化する例がたくさんあるので、何か理由があるのだろうと思っています。
どのように解決するのですか?
JUnit FAQにある例について具体的に疑問に思っている場合、例えば 基本テストテンプレート のような JUnit FAQ の例について特に疑問に思うのであれば、そこで披露されているベストプラクティスは クラスが は setUp メソッド (またはテストメソッド) でインスタンス化する必要があるということです。
JUnitの例では、setUpメソッドでArrayListを作成すると、testIndexOutOfBoundExceptionやtestEmptyCollectionなどのケースで、そのArrayListの動作をテストするようになっている。そこでの視点は、誰かがクラスを書き、それが正しく動作することを確認することです。
あなた自身のクラスをテストするとき、おそらく同じことをすべきです: setUpまたはテストメソッドでオブジェクトを作成し、後でそれを壊した場合に妥当な出力を得ることができるようにします。
一方、テストコードでJavaのコレクションクラス(あるいは他のライブラリクラス、そのことに関して)を使う場合、それはおそらくそれをテストしたいからではなく、単にテストフィクスチャの一部です。この場合、意図したとおりに動作していると考えてよいので、宣言で初期化することは問題ないでしょう。
価値あることですが、私はそれなりに大きく、数年前の、TDD で開発されたコードベースで仕事をしています。私たちは習慣的に、テスト コードの宣言で物事を初期化しており、私がこのプロジェクトに参加している 1 年半の間、問題を起こしたことは一度もありません。ですから、それが合理的なことであるという少なくともいくつかの逸話的な証拠があるのです。
関連
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
Java Exceptionが発生しました エラー解決
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
HttpClientがGZIP形式でない場合の対処法
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] クラスフィールドの初期化はコンストラクタで行うか、宣言時に行うか?
-
[解決済み] JUnitの混乱:'extends TestCase'を使うか'@Test'を使うか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
をインスタンス化することができません。
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
HttpClientがGZIP形式でない場合の対処法
-
ローカルリソースのロードが許可されていない場合の解決策