1

我的问题是我无法将 Hashtable 数组转换为对象数组。这里的内容读取从 xls 文件中读取每一行,并以这种格式将其保存在哈希表数组中:

roleName=testRole981, admin=admin, projectName=Automateme, userPassword=aspiresys12, roleDesc=grant[testplan_execute],grant[testplan_create_build],grant[testplan_metrics], adminPass=admin, userName=mur

我想将该 hashTable 数组转换为一个对象数组,以便我可以在我的 testNG 测试用例中将它们作为 DataProvider 传递。

public class DriverScript {
 //public boolean isExecuted = true;
 Object[][] Obj = new Object[100][100];
 @SuppressWarnings("unchecked")
  @DataProvider(name="Test")
  public Object[][] ValidDataProvider() {
  Utilities util = new Utilities();
  String pathValue = Utilities.LocatingXls("Data.xls");
  Hashtable<String, String>[] hashDrv = (Hashtable<String, String>[]) util.contentReading(pathValue, "Scenario1"); 
   Object[][] Obj = new Object[100][100];
   for(int i=0;i<hashDrv.length;i++)
   {
    System.out.println("cont vector reading" + hashDrv[i].get("projectName"));
    Obj[i][0] = hashDrv[i];
   }
  System.out.println("outsideloop" + Obj[0][0]); 
  return  Obj;
  }

 @SuppressWarnings("unchecked")
 @Test(dataProvider = "Test")
    public  void methodtest(Hashtable <String, String> a)

 {
/* Utilities util = new Utilities();
 String pathValue = Utilities.LocatingXls("Data.xls");
 Hashtable<String, String>[] hashDrv = (Hashtable<String, String>[]) util.contentReading(pathValue, "Scenario1"); 
 for(int i=0;i<hashDrv.length;i++)
 {
  System.out.println("cont vector reading" + hashDrv[i].get("projectName"));
  Scenario1 scnTst=new Scenario1(hashDrv[i]);
  scnTst.check1();
 }
  if(!isExecuted)
  {
   Assert.fail("falied");
  }
 }*/

}}
4

2 回答 2

1

由于使用此数据提供程序的测试方法有一个参数,因此数组的第二维Object[][]应该是 1,而不是 100。也许像这样(未经测试的)代码:

@SuppressWarnings("unchecked")
@DataProvider(name="Test")
public Object[][] validDataProvider() {
    Utilities util = new Utilities();
    String pathValue = Utilities.LocatingXls("Data.xls");
    Hashtable<String, String>[] hashDrv = (Hashtable<String, String>[])
        util.contentReading(pathValue, "Scenario1"); 
    Object[][] obj = new Object[hashDrv.length][1];
    for(int i=0; i<hashDrv.length; i++) {
        System.out.println("cont vector reading" 
            + hashDrv[i].get("projectName"));
        obj[i][0] = hashDrv[i];
    }
    System.out.println("outsideloop" + obj[0][0]); 
    return obj;
}
于 2010-07-30T06:06:51.680 回答
0

该类Hashtable实现Map接口。这个接口上有一个方法叫做values()- 它返回一个Collection. 然后,您可以调用toArray()该集合以获取数组。

例子:

Hashtable h = // .... initialised and populated somewhere else
Collection c = h.values();
Object[] objectArray = c.toArray();

问题:

  1. 上面的代码没有使用泛型,所以到处都会有警告。
  2. Hashtable可能不是最适合您使用的类,请尝试HashMap. HashTable是同步的,因此如果您不希望线程安全,则使用该类将导致代码变慢。
  3. 您真的应该对接口进行编程:(Map map = new HashMap();或者Hashtable如果您愿意。
于 2010-07-30T06:00:18.857 回答