2017-03-14 41 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。依賴注入](http://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency-injection)可能有所幫助。至少,有一個可選的'getTestClass()'訪問器。 – Sormuras

+0

不幸的是,我不認爲這種情況。 TestExecutionListener不知道作爲參數傳遞給測試方法的內容。 此外,它暗示每個測試方法都必須將TestInfo作爲參數 - 它並不總是如此 –

+0

我可能沒有完全按照您的要求。在JUnit4中(&我假設5),我們使用了幾個'@ Rule'註解(一個是TestWatcher(),另一個就是TestName())來獲取問題的一部分。我們還使用了Thread.currentThread()。getStackTrace()並從堆棧跟蹤中發出適當的信息。 – KevinO

回答

2

保存在testPlanExecutionStartedTestPlan參考並使用testPlan.getParent(testIdentifier)檢查TestIdentifier的父的TestSource。如果它是ClassSource,則可以通過classSource.getJavaClass()訪問Class

+0

建議的決定不適用於所有情況,儘管其中一些可以涵蓋。 例如它不適用於JUnit5動態測試工作。 - 如果動態測試是正在運行 testPlan.getParent(標識符)獲得()的getSource() 不包含ClassSource 萬一當Junit4參數化的測試是運行 該參數化測試的testPlan.getParent(identifier).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

用作像參數
相關問題