1. ホーム
  2. java

[解決済み] ベストプラクティス。JUnitクラスのフィールドを初期化するのはsetUp()の中か、それとも宣言時か?

2022-06-28 20:15:10

質問

クラスフィールドは、このように宣言時に初期化する必要があるのでしょうか?

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 年半の間、問題を起こしたことは一度もありません。ですから、それが合理的なことであるという少なくともいくつかの逸話的な証拠があるのです。