mike-neckのブログ

Java or Groovy or Swift or Golang

Enclosedと継承を使って特定のメソッドだけAfterとか実行させない

こんなのがあったから、マジクソレス。

眠いだけなので、害意はありません。

@Beforeで全てのテストメソッドで初期化するけど、特定のテストメソッドだけ@Afterの処理をさせたくないらしい。

回答 : 継承と@RunWith(Enclosed.class)使えば良い。

package q.yy.yank;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.rules.TestName;
import org.junit.runner.RunWith;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

@RunWith(Enclosed.class)
public class SkipSomeAfter {
    public static abstract class SameBefore {
        @Rule
        public TestName name = new TestName();

        @Before
        public void setUp() {
            System.out.println(name.getMethodName() + " - やるよ");
        }
    }

    public static class RunAfterTests extends SameBefore {
        @After
        public void tearDown() {
            System.out.println(name.getMethodName() + " - 楽しかったね");
        }

        @Test
        public void うらがみ() {
            assertThat(1, is(1));
        }

        @Test
        public void しょぼちむ() {
            assertThat("ふええ", is("ふええ"));
        }

        @Test
        public void たろう() {
            assertThat("こっとりん".length(), is(5));
        }

        @Test
        public void よこな() {
            assertThat("じゃんけん", is(notNullValue()));
        }
    }

    public static class ハブ extends SameBefore {
        @Test
        public void やんく() {
            assertThat(":q!", is(":q! :q!"));
        }
    }
}

実行結果はこんな感じだった

Done 5 of 5 Failed: 1

やんく - やるよ

java.lang.AssertionError: 
Expected: is ":q! :q!"
     but: was ":q!"

Expected ::q! :q!
Actual   ::q!

たろう - やるよ
たろう - 楽しかったね
よこな - やるよ
しょぼちむ - やるよ
しょぼちむ - 楽しかったね
よこな - 楽しかったね
うらがみ - やるよ
うらがみ - 楽しかったね

Process finished with exit code 255