web-dev-qa-db-ja.com

JUnit:@Beforeは一部のテストメソッドに対してのみですか?

@Beforeでマークされたメソッドに除外したいくつかの一般的なセットアップコードがあります。ただし、このすべてのコードをすべてのテストで実行する必要はありません。 @Beforeメソッドが特定のテストの前にのみ実行されるようにマークする方法はありますか?

40
Nick Heiner

セットアップコードを必要としないテストを別のテストクラスに移動するだけです。保持するのに役立つであろうテストに共通する他のコードがある場合は、それをヘルパークラスに移動します。

36
Kirschstein

または TestNG を使用します。テストをより細かく制御できます。

5
duffymo

@ネスト+ @ForEach

関連するコードを内部クラスに移動する点に完全に同意します。だからここで私がやったこと。

  1. テストクラス内に内部クラスを作成する
  2. @Nestedで内部クラスに注釈を付ける
  3. 内部クラスで使用するすべてのテストメソッドを移動する
  4. 内部クラス内に初期化コードを記述し、@ ForEachで注釈を付けます

これがコードです:

class Testing {

    @Test
    public void testextmethod1() {

      System.out.println("test ext method 1");

    }

    @Nested
    class TestNest{

       @BeforeEach
       public void init() {
          System.out.println("Init");
       }

       @Test
       public void testmethod1() {
          System.out.println("This is method 1");
       }

       @Test
       public void testmethod2() {
          System.out.println("This is method 2");
       }

       @Test
       public void testmethod3() {
          System.out.println("This is method 3");
       }

     }

     @Test
     public void testextmethod2() {

         System.out.println("test ext method 2");

     }

}

これが出力です

test ext method 1
test ext method 2
Init
This is method 1
Init
This is method 2
Init
This is method 3

注:これがJunit4でサポートされているかどうかはわかりません。私はJUnit5でこれをやっています

4
Rohit Singh

JUnitから Assume を介して実現することもできます。次に、処理するメソッド名を確認できます@Before

public class MyTest {
     @Rule
     public TestName testName = new TestName();

     @Before
     public void setUp() {
       assumeTrue(testName.getMethodName().equals("myMethodName"));
       // setup follows
     }
}

トピック を確認して、@Rule

3
vtor

@Beforeについてはわかりませんが、最近、@ Afterブロックを選択的に実行するための戦略を思いつきました。実装は簡単でした。テストクラスの一部として、いくつかのフラグをデフォルト値に設定しています。それらは@Beforeクラスのデフォルト値にリセットされます。フラグに固有のことを行う必要があるクラスでは、それらのフラグを設定し、@ Afterでそれぞれのジョブを実行するためにフラグ値を確認します。

0
Pocha