2017-11-09 11 views
0

私たちは@Beforeと@Afterでアノテーションを付けられ、テストの構築/破壊を実行する多くのテストクラスを持っています。@Beforeと@Afterのアノテーションを無視するようにJUnitを設定するには

しかし、今はテストの失敗に対して、@Afterを実行する前にアクションを実行する必要があるため、私たちはテスト構築/破壊を処理するためにRuleChainを使用しています。 setUp()メソッドとtearDown()メソッドを指すだけです(ほとんどの開発者がこのコンベンションに固執していたことは幸運でした)。

問題は、JUnitはまだ@Beforeと@Afterで注釈を付けられたメソッドを呼び出すだけでなく、新しいルールでそれらを呼び出すことです。それを

は、コアJUnitのは、最も内側のfor文

org.junit.internal.runners.statements.RunAfters.evaluate 

を呼び出しているのです。

@Beforeアノテーションと@Afterアノテーションをテストから削除するという選択肢が1つありますが、何百ものテストがあります。

@Beforeと@Afterの処理をどのように切り替えることができますか?

答えて

1

JUnitの「スイッチ」をフリックしてこの動作を無効にすることはできません。 JUnitは、テスト実行動作を変更する2つの方法を提供します:

  • は、これらの第二の選択肢で、これらの両方は、あなたのテストケースを変更する必要がテストケース

Ruleを追加BlockJUnit4ClassRunner

  • を拡張しますテストケースがすでにカスタマイズされたランナーを使用しているかどうかによって異なりますが、最も侵襲的ではありません。次のテストケースを通過する

    public class IgnoreBeforeAndAfter extends BlockJUnit4ClassRunner { 
    
        public IgnoreBeforeAndAfter(Class<?> klass) throws InitializationError { 
         super(klass); 
        } 
    
        protected Statement withBefores(FrameworkMethod method, Object target, 
                Statement statement) { 
         return statement; 
        } 
    
        protected Statement withAfters(FrameworkMethod method, Object target, 
                Statement statement) { 
         return statement; 
        } 
    } 
    

    (それによって@Before@Afterメソッドが呼び出されていないことを証明):

    @RunWith(IgnoreBeforeAndAfter.class) 
    public class SimpleTest { 
    
        @Before 
        public void setUp() { 
         Assert.fail("The @Before method should be ignored!"); 
        } 
    
        @After 
        public void tearDown() { 
         Assert.fail("The @After method should be ignored!"); 
        } 
    
        @Test 
        public void canIgnoreBeforeAndAfter() { 
         assertTrue(true); 
        } 
    } 
    

    構造探索+で置き換えるこの単純なJUnitのランナーを考える

    コードベースを使用して、@Beforeまたは@Afterのうちの少なくとも1つを含むすべてのテストケースにこの注釈を追加できます。

    もちろん構造検索+置換でコード内の@Before@Afterの注釈もすべて削除することもできます。

    既存のテストケースを変更する必要はありません(ただし、やや非標準である)

    • org.junit.internal.runners.statements.RunAfters
    • org.junit.internal.runners.statements.RunBefores
    ...のノーオペレーションの実装を提供することでアプローチ

    ...独自のコードベースでは、これらはJUnitに相当するものを「置き換える」でしょう。そのevaluate()メソッド本体が空であれば、@Before@After nnotationsは効果がありません。

  • +0

    ありがとうございました。 RunWithを使用すると、素晴らしい解決策のように見えます。残念ながら、私たちのテストクラスには既に@RunWithが付いていて、BlockJUnit4ClassRunnerの代わりにTestSuiteから拡張された第2パーティーランナーを使用していますので、使用することはできません。しかし、TestClassでTestRuleアノテーションを定義し、TestClassを使用してBeforeアノテーションとAfterアノテーションを検索することで、私たちを破壊するBefore/Afterアノテーションを発見した場合、少なくともログまたは失敗することができます。 BlockJUnit4ClassRunnerの機能がより高いレベルで公開されていないことは残念です。 – William

    +0

    注釈を使用してBeforeClass、Before、AfterClass、Afterなどのすべての動作をランナーに注入できるのは良いことです。 – William

    +1

    ええ、フックが実装されている方法は単純なケースでうまく動作しますが、チェリーチェッカーを実行してチェリーを実行するのは難しくなります。 – glytching

    関連する問題