2014-02-25 47 views
5

我一直在TestNG中編寫測試。我的目標是爲測試方法提供可變長度的參數。我面臨一個對我沒有任何意義的問題。代碼如下:TestNG方法中的可變長度參數

@DataProvider(name = "testData") 
public static Object[][] testDataProvider() { 
    return new Object[][] { 
     { 
      "hello", 
      "bye" 
     } 
     { 
      "hey" 
     } 
    }; 
} 

@Test(dataProvider = "testData", DataProviderClass = TestData.class) 
public void test(String... strings) { 
    if (strings.length == 1) { 
     // do something 
    } 
    else { 
     // do something 
    } 
} 

此代碼給我IllegalArgumentException

1 java.lang.IllegalArgumentException: argument type mismatch 
    2  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    3  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    4  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    5  at java.lang.reflect.Method.invoke(Method.java:606) 
    6  at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) 
    7  at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 
    8  at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    9  at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
10  at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
11  at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
12  at org.testng.TestRunner.privateRun(TestRunner.java:767) 
13  at org.testng.TestRunner.run(TestRunner.java:617) 
14  at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
15  at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
16  at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
17  at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
18  at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
19  at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
20  at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) 
21  at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
22  at org.testng.TestNG.run(TestNG.java:1057) 
23  at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
24  at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
25  at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 

請問有人可以告訴我爲什麼會出現這個錯誤,我該如何解決這個問題?

+0

在我的情況下,改變對象[] [] - >字符串[] []幫助。這基本上與@Anuragh27crony建議的一樣,但是可以避免你一直輸入'new String []' –

回答

8

請儘量使用正確的數組初始化,它應該工作。 我試過相同的代碼只是正確的數組初始化,它的工作。

@DataProvider(name = "testData") 
    public static Object[][] testDataProvider() { 
     return new Object[][] {new String[]{"abc","abcd"},new String[{"abc","abcd","123"}}; 
    } 

    @Test(dataProvider = "testData") 
    public void test(String... str) { 
     System.out.println("The Length is"+str.length); 

    } 

而且安裝TestNG的結果... enter image description here

希望這有助於

+1

當測試方法只有一個參數並且該參數是可變參數時,這確實是解決問題的工作方式。 –

0

當前TestNG 6.8.8不支持每個測試方法提供多個提供程序,並且從TestNG的角度來看,@Test(dataProvider =「testData,testData2」)形式的測試聲明註釋意味着應該是名爲「testData,testData2」的數據提供者,而不是有兩個名爲「testData」和「testData2」的提供者。

之後,TestNG如何處理可變參數方法中存在一個錯誤。有問題的源代碼是https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/internal/Invoker.java#L1358,正如您所見,TestNG將基本上將整個參數數組添加爲最後一個參數。有相關的請求https://github.com/cbeust/testng/pull/456https://github.com/cbeust/testng/pull/459

的解決方法:只使用明確的基於陣列的參數,例如:

@DataProvider(name = "testData") 
public static Object[][] testDataProvider() { 
    return new Object[][] { 
      { 
        new String[]{"a", "b"} 
      }, 
    }; 
} 

@Test(dataProvider = "testData") 
public void test(String[] strings) { 
} 

如果你真的需要verarg測試方法的話,直到TestNG的錯誤是固定的,如果只剩下一個只有與對象作爲變量參數基本類型單一的可變參數參數:

@DataProvider(name = "testData") 
public static Object[][] testDataProvider() { 
    return new Object[][] { 
      { 
        // values of any type that will be wrapped into a single vararg parameter 
        456, "string", "another string", 456 
      }, 
    }; 
} 

@Test(dataProvider = "testData") 
// single vararg parameter 
public void test(Object... values) { 
} 
+0

謝謝,但是擔心是不同的 - 在測試中傳遞可變長度參數。我也修改了相同的問題。 –

+0

基於數組的顯式參數也沒有幫助 –

+0

我的答案中顯示的來自顯式數組的參數可以工作。 –

0

另一種方式是將您的varagrs爲對象類型和轉換爲字符串類型上@Test

@Test(dataProvider = "testData") 
public void test(Object... args) { 
    String data0=(String) args[0]; 
} 

希望得到這個幫助!