2017-06-26 5 views
0

ユニットカスタムランナーでは、テストアクションの実行前後にアクションを実行したいので、 です。実行前と実行後のカスタムJunitランナー

このようにしっかりしているのは、それを達成するためのよりクリーンな方法でしょうか?

public class SomeCustomRunner extends BlockJUnit4ClassRunner { 
    private int m_testMethodIndex = 0; 
    private int m_testMethodsCount = 0; 
    private boolean m_sessionSetup = false; 

    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
     if(m_sessionSetup == false) { 
      m_sessionSetup = true; 
      beforeTestClass(); //->> DO MY STUFF HERE 
     } 

     super.runChild(method, notifier); 

     m_testMethodIndex++; 

     if(m_testMethodIndex == m_testMethodsCount) { 
      afterTestClass(); //->> DO MY STUFF HERE 
     } 
    } 

    @Override 
    protected List<FrameworkMethod> getChildren() { 
     List<FrameworkMethod> methods = super.getChildren(); 
     m_testMethodsCount = methods.size(); 
     return methods; 
    } 
} 

答えて

1

代わりに別のテストランナーを作成するには、@BeforeClass RESPでアノテート方法でテストクラス自体に前と後に実行するアクションを定義することができます。 @AfterClass

複数のテストでそれらを再利用するには、ベースクラスから簡単に継承できます。

+0

。この複雑なケースのために私はそれを必要とするかもしれません –

+1

JUnit APIはこのケースをサポートしていないようです。しかし、マルチスレッドなどのテストケースで例外が発生した場合のソリューションの動作を確認することはできません。 –

+0

この "ハック"は何か悪いことがわかっているかもしれません。 –

0

最も簡単な方法は、以下のようにrunメソッドをオーバーライドしている:私はそれらを認識していますが、私のベース走者がテストメソッドその後、多くをやっている

public class LifecycleRunner extends BlockJUnit4ClassRunner { 

    public LifecycleRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    public void run(RunNotifier notifier) { 
     beforeRunTests(); 
     try { 
      super.run(notifier); 
     } finally { 
      afterRunTests(); 
     } 
    } 

    private void afterRunTests() { 
     trace(); 
    } 

    private void beforeRunTests() { 
     trace(); 
    } 

    private void trace() { 
     System.out.println(Thread.currentThread().getStackTrace()[2]); 
    } 
} 
関連する問題