2015-02-10 72 views
0

向@Parameterized測試類注入一組參數最簡單的方法是什麼?JUnit:插入@Parameterized參數?

使用案例:

我有一個普通的類,看起來像這樣

@RunWith(Parameterized.class) 
class Tests { 

    public void testOne() { } 
    public void testTwo() { } 

    @Parameters 
    public static Collection<Object[]> generateData() { } 

} 

一個標準的JUnit運行可以調用這樣的: org.junit.runner.JUnitCore.runClasses(TestClass1。類,...);

但是,沒有辦法指定/覆蓋參數。

如何注入我自己的參數?

+0

這似乎是[一個XY問題(http://meta.stackexchange.com/questions/66377 /什麼,是最XY-問題)。說明你的基本問題是否公平:**我如何輕鬆地只運行那些在大型參數化測試中失敗的測試?**如果是這樣,你能否確認你正在使用哪個IDE,假設你試圖達到這個目標IDE中的目標是什麼? – 2015-02-11 08:01:51

+0

這是公平的說,我的根本問題是:*儘管可以運行測試類使用(例如)JUnitCore,我怎麼也傳遞參數,以便它不會使用參數中給出的參數。*? – 2015-02-11 12:21:12

+0

您能否提供更多關於「注入我自己的參數」的含義的信息。 – 2015-04-15 18:08:38

回答

-1

我會使用generateData()方法,它會生成所有五百個元素。另外,我會添加一個getParameters()的方法,用@Parameters註釋。它可以調用generateData()來獲得完整的集合,然後加載日誌文件(如果存在)並將集合減少到失敗的測試參數。如果沒有日誌文件存在,它將返回整個集合。您可能需要明確指定參數的名稱才能識別它們,因爲JUnit不保證以相同順序重新運行測試/測試參數(請參閱Changing names of parameterized tests)。

@RunWith(Parameterized.class) 
public class Tests { 

    @Parameters 
    public static Collection<Object[]> getParameters() { 
    List<Object[]> parameters = generateData(); 
    return filterParameters(parameters); 
    } 

    private static Collection<Object[]> filterParameters(Collection<Object[]> params) { 
    // load a file to exclude successful tests 
    // ... 
    } 

    private static Collection<Object[]> generateData() { 
    return new ArrayList<Object[]>(); 
    } 
} 

另一種方法可能是使用一個ScannerSystem.in@Parameters方法,以便您可以從控制檯用戶輸入選擇的參數。但是,如果要在持續集成中使用它們,則需要確保某種方式仍然可以在沒有用戶交互的情況下運行測試。

0

junit不是爲您的參數運行其他人的junit類而設計的。所以如果可能的話,重構你的測試類,使他們支持你想要的行爲。如果你不能重構,那麼你所能做的就是使用一些解決方法。例如:

  • 如果測試類是正確寫入的(例如沒有靜態引用),那麼您可以繼承測試類並提供自己的參數。但仍需要在類文件中明確提供參數,而不是在運行期間
  • 您可以嘗試使用自定義類加載器和字節碼生成/轉換來更改類加載的參數提供程序方法。同樣的方式PowerMockito工作
  • 寫你定製的運行,因此會忽略一流的參數,並使用自己的,而不是