2010-08-16 23 views
6

我寫了一個模擬的例子來說明這一點,而沒有暴露任何機密。這是一個「虛擬」的例子,它什麼都不做,但問題發生在測試初始化​​程序中。如何使用帶可變參數構造函數的JUnit參數化運行器?

@RunWith(Parameterized.class) 
public class ExampleParamTest 
{ 
int ordinal; 
List<String> strings; 

public ExampleParamTest(int ordinal, String... strings) 
{ 
    this.ordinal = ordinal; 
    if (strings.length == 0) 
    { 
    this.strings = null; 
    } 
    else 
    { 
    this.strings = Arrays.asList(strings); 
    } 
} 

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, "hello", "goodbye"}, 
    {1, "farewell"} 
    }); 
} 

@Test 
public void doTest() { 
    Assert.assertTrue(true); 
} 
} 

基本上我有一個測試構造,其接受多個參數爲本地列表變量,我想通過陣列初始化劑填充此。測試方法將正確處理本地列表變量 - 我已經刪除了這個邏輯來簡化測試。

當我寫這篇文章時,我的IDE對語法沒有任何抱怨,並且測試類的構建沒有任何編譯錯誤。但是當我運行它時,我得到:

doTest[0]: 
java.lang.IllegalArgumentException: wrong number of arguments 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
doTest[1]: 
java.lang.IllegalArgumentException: argument type mismatch 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 

這裏究竟出了什麼問題,以及如何正確使用此模式?

+0

什麼是doTest,它保存着什麼數據? – Jes 2010-08-16 13:48:09

+0

在這個例子中,doTest只是一個虛擬測試,允許這個測試套件在JUnit中執行。問題不在測試代碼中,因爲您會看到當您嘗試運行此測試時的情況;儘管它具有幾乎空的測試體,但由於上述初始化錯誤,它仍然無法運行。 – Kidburla 2010-08-16 13:50:21

+0

我添加了一部分stacktrace,當我運行你的測試時,我清楚地看到當調用varargs構造函數時發生錯誤。如果這與您所看到的不同,請隨時更改或還原。 – 2010-08-16 13:53:42

回答

11

現在無法對其進行測試,但我猜測,如果您調用具有可變參數的方法或構造函數,則必須使用數組而不是變量列表值來調用它。

如果我是正確的,那麼這應該工作:

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, new String[]{"hello", "goodbye"}}, 
    {1, new String[]{"farewell"}} 
    }); 
} 

一些解釋

在源代碼級,我們可以寫

test = ExampleParamTest(0, "one", "two"); 

編譯器將其轉換到一個字符串數組。 JUnit使用反射和調用API,並從這個角度看,構造函數簽名是

public ExampleParamTest(int i, String[] strings); 

所以調用構造函數 - 這就是JUnit是國內做的 - 你必須通過一個整數和一個字符串數組。

+0

我試了一下,它的工作原理。 – 2010-08-16 13:57:42

+0

你說得對,這確實奏效。但這並不普遍。通常情況下,我可以寫如下: myTest = new ExampleParamTest(0,「hello」,「goodbye」); 這是可變參數方法的全部要點。爲什麼這在我的例子中不起作用? – Kidburla 2010-08-16 13:59:05

相關問題