2017-10-23 3 views
1

私はJavaを初めて使い、JUnitでユニットテストを進めています。テストクラスの開始時に各特定のテストバイス内でオブジェクトを初期化するのが悪い習慣であるのなら、私は不思議でした。例えば:ユニットテスト内での初期化

public class MyTest { 
    @Test 
    public void defaultObj() { 
     Obj d = new Obj(); 
     String name = ""; 
     assertEquals(name, d.getName()); 
    } 

再び

public class MyTest { 
    Obj d = new Obj(); 
    String name = "";  

    @Test 
    public void defaultObj() { 
     assertEquals(name, d.getName()); 
    } 

対、私は複数のユニットテストを持っていると仮定すると、私はそれらのひとつひとつの1に Obj d = new Obj();を呼び出すことになります。後者がより適切であるかのように感じます。しかし、私はそれぞれのintiailizatonがローカライズされているので、より明示的であると思っていました(右か?) Objに対して複数のコンストラクタを持たなければならないので、最初の私の初期化はスタックし始めます。

ここにベストプラクティスのイディオムはありますか?またはどちらか受け入れ可能ですか?

+0

2番目の例は、すべての単体テスト方法でコンストラクタを呼び出すことを前提としています。 – alayor

+0

@alayorそう、私はそれを何度も何度も馬鹿だと思った。 – datta

+0

また、JUnitがどのように機能するかについての一般的な考え方があれば、Spockを検討することもできます。実際にはJUnitの上で動作しますが、各テストケースごとに自動的にフィールドを再初期化すること(例えば、 'String name = randomName()')を含む多くの構文上の利便性も提供します。 – chrylis

答えて

1

あなたはクラスレベルで(この場合はObjで)をテストしようとしているオブジェクトを宣言されてできる最善のようにJUnitの注釈を使用することができます。次に、@Beforeメソッド内のコンストラクタを呼び出します。

メソッド内でnameプロパティを宣言する方が、すべてのメソッドで使用されないと想定している方が良いでしょう。

public class MyTest { 
    private Obj d; 

    @Before 
    public void defaultObj() { 
    d = new Obj(); 
    } 

    @Test 
    public void defaultObj() { 
    String name = ""; 
    assertEquals(name, d.getName()); 
    } 
} 
+0

作成されたオブジェクトを毎回削除してメモリをクリアするために '@ After'コールを行うべきですか? – datta

+0

あなたはそうする必要はありません。ガベージコレクタがその仕事をします。 – alayor

+1

@dattaそしてC + +のような言語からJavaに来るなら、それは大きな意味です。オブジェクトが(ウィンドウハンドルのような)外部リソースを保持していない限り、それらを削除するのは慣例ではありません。私は、クリーンアップコードなしで(組み込みシャットダウンハンドラ以外の)Webアプリケーション全体を日常的に記述しています。 – chrylis

1

あなたは@Beforeと@After

public class MyTest { 

Obj d; 
String name; 

@Before 
public void setup() { 
    d = new Obj(); 
    name = "";  
} 

@Test 
public void defaultObj() { 
    assertEquals(name, d.getName()); 
} 
+0

これらの注釈は、メソッドが毎回正しく実行されることを意味しますか?ですから、私は '@ Before'、' @ Test'#1、 '@ Test'#2を持っています。 '@ Before'が実行されると、#1、' @ Befor'eが再び実行され、次に#2が実行されます。 – datta

+0

@dattaはい。 '@ BeforeClass'と' @ AfterClass'が一回実行され、各テストについて '@ Before'と' @ After'が実行されます。メソッドには分かりやすい名前を付けるべきですが、アノテーションはフレームワークが探しているものであることに注意してください。 – chrylis

+0

クラスレベルで 'name'を宣言するのは意味がないと思います。 – alayor

関連する問題