2013-10-21 77 views
1

我試圖將@DataProvider與TestNG和arquillian一起使用,但我無法弄清楚爲什麼當我使用創建的類時它不起作用。TestNG上的DataProvider

如果我使用它與字符串或任何基本數據類型,我的@Test方法成功接收DataProvider填充對象。

@DataProvider(name="test") 
public Object[][] createdata1() { 
    return new Object[] { {"test1"}, {"test2"}, {"test2"} }; 
} 

上述方法的工作原理,但

@DataProvider(name="test") 
public Object[][] createdata1() { 
    return new Object[] { {new User("test1")}, {new User("test2")}, {new User("test2")}}; 
} 

沒有。這第二種方法只給我空指針。

任何想法?

回答

6

而是返回以下內容。

return new Object[][]{ 
     {new User("test1")}, 
     {new User("test2")}, 
     {new User("test2")}}; 

更妙的是, 如果你經常使用DataProvider的,你可以創建輔助類下面的輔助方法,以幫助輕鬆地創建數據

public static Object[][] provideData(Object... arObj) { 
    Object[][] arObject = new Object[arObj.length][]; 

    int index = 0; 
    for (Object obj : arObj) { 
     arObject[index++] = new Object[]{obj}; 
    } 
    return arObject; 
} 

因此,下面是更容易解釋 - >

@DataProvider(name="test") 
public Object[][] createdata1() { 
    return provideData(new User("Test1"), new User("Test2"), new User("Test3")); 
2

你必須返回一個數組數組,這個語法的動機是有n-測試用例的n個參數。所以正確的語法是每個測試返回一個User

package testng; 

import org.testng.Assert; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

public class SomeTest { 
    @DataProvider(name = "test") 
    public Object[][] createdata() { 
    return new Object[][] { 
     new Object[] { new User("test1") }, 
     new Object[] { new User("test2") }, 
     new Object[] { new User("test2") } }; 
    } 

    @Test(dataProvider = "test") 
    public void xxx_happyPath_success(User user) { 
    Assert.assertNotNull(user); 
    } 
}