2017-03-14 6 views
1

私はテスト実行リスナーを作成しています。 Junit5フレームワークの少しの拡張。 TestIdentifierTestPlanの特定のテストを実行するときにどのクラスが使用されているかを知る必要があります。JUnit5 - 実行されたテストのクラスを取得するための信頼できる方法はありますか?

((MethodSource) id.getSource().get()).getClassName(); 

テストが宣言のみクラスを与えます。 しかし、それは宣言されたクラスから実行されているわけではありません。

たとえば、テストはサブクラスから実行できます。 TestIdentifier#getUniqueId() ため

解析結果は、私が見つけられませんでした。このとき (junit4ための単一のテスト、junit5ための単一のテスト、junit5のための動的テスト、junit4ためのパラメータ化テストなど)

を小文字する場合と異なることができますそれを行う可能性があります。

実行されたテストのクラスを取得する信頼できる方法はありますか?

+0

[TestInfo(http://junit.org/junit5/docs/current/api/org/junit/jupiter/api/TestInfo.html)のようなパラメータとして使用に転記され[3.9。 Dependency Injection](http://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency-injection)が役に立ちます。少なくとも、オプションの 'getTestClass()'アクセサがあります。 – Sormuras

+0

不幸なことに、私は考えていません。 TestExecutionListenerは、テストメソッドにparamsとして渡される内容を認識しません。 さらに、すべてのテストメソッドがTestInfoをparamとして持つ必要があることを暗示しています - 必ずしもそうではありません –

+0

私はあなたの要件を厳密に守っていないかもしれません。 JUnit4(私は5と仮定しています)では、あなたの質問の一部を得るために、2つの '@ Rule'アノテーション(1つはTestWatcher()、もう1つはTestName()です)を使用します。また、Thread.currentThread()。getStackTrace()を使用して、スタックトレースから適切な情報を生成しました。 – KevinO

答えて

2

testPlanExecutionStartedTestPlanへの参照を保存しtestPlan.getParent(testIdentifier)を使用してTestIdentifierの親のTestSourceを点検します。 ClassSourceの場合はclassSource.getJavaClass()Classにアクセスできます。

+0

提案された決定はすべてのケースで機能するとは限りません。それはJUnit5動的試験のために動作しない例えば - Junit4テストがパラメータ化ときに、動的テストを実行 testPlan.getParent(識別子)に.get()されている場合メソッドgetSource() は場合ClassSource を含みません実行する testPlan.getParent(識別子).get()。そのパラメータ化されたテストのgetSource()はnullです。 –

1

私は説明された状況のために一時的な解決策を見つけました。 アイデアは、すべての親を通過し、まずClassSourcesを含むものを見つけ、そのClassSourceを使用することです。

private static String findTestMethodClassName(TestPlan testPlan, TestIdentifier identifier) { 
    identifier.getSource().orElseThrow(IllegalStateException::new); 
    identifier.getSource().ifPresent(source -> { 
     if (!(source instanceof MethodSource)) { 
      throw new IllegalStateException("identifier must contain MethodSource"); 
     } 
    }); 


    TestIdentifier current = identifier; 
    while (current != null) { 
     if (current.getSource().isPresent() && current.getSource().get() instanceof ClassSource) { 
      return ((ClassSource) current.getSource().get()).getClassName(); 
     } 
     current = testPlan.getParent(current).orElse(null); 
    } 
    throw new IllegalStateException("Class name not found"); 
} 

そのソリューションは私のニーズをカバーしていますが、それは、フレームワークの挙動が、将来的に変更されておらず、現時点では信頼性が考慮されないことを一切保証を行いません。

問題がhttps://github.com/junit-team/junit5/issues/737

関連する問題