2013-10-21 91 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); 
    } 
}