Return 来自数据提供者的地图迭代器
Return an Iterator over Map from Data Provider
public class DemoTest {
private static final ThreadLocal<WebDriver> webDriverThreadLocal= new InheritableThreadLocal<>();
private String baseUrl;
Random random = new Random();
int no;
private final Map<Integer, String> map =new LinkedHashMap<Integer, String>();
@Test(dataProvider = "dp1")
public void f(Integer n, String s) {
WebDriver driver = webDriverThreadLocal.get();
no= random.nextInt(4);
map.put(no, "1234567");
}
@Test(dependsOnMethods = {"f"}, dataProvider = "dp2")
public void f1(Integer uname, String password){
System.out.println("uname:"+uname+" password:"+password);
System.out.println("In f1 id:"+Thread.currentThread().getId());
}
@BeforeMethod
public void beforeMethod() {
WebDriver driver= new FirefoxDriver();
// driver = ThreadGuard.protect(new FirefoxDriver());
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
webDriverThreadLocal.set(driver);
System.out.println("Before method id:"+Thread.currentThread().getId());
}
@AfterMethod
public void afterMethod() {
WebDriver driver = webDriverThreadLocal.get();
System.out.println("After method id:"+Thread.currentThread().getId());
System.out.println("");
if(driver != null ) {
driver.quit();
// driver.close();
}
}
@DataProvider(name ="dp1" ,parallel=true)
public Object[][] dp() {
return new Object[][] {
new Object[] { 1, "a" },
new Object[] { 2, "b" },
new Object[] { 3, "c" },
new Object[] { 4, "d" },
};
}
@DataProvider(name="dp2" , parallel=true)
public Iterator dp2() {
return this.map.entrySet().iterator();
}
- 测试 f1 依赖于测试 f。
- f1 生成随机数和一个字符串,作为测试 f1 的输入。
- 我想将映射迭代器从测试 f 传递到测试 f1。
这是我目前尝试过的方法。
我收到以下错误:
java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be
cast to [Ljava.lang.Object;
如何解决这个问题?
TestNG 数据提供者必须 return Object[][]
或 Iterator<Object[]>
但 dp2()
return 两者都不是。
this.map.entrySet().iterator()
return 一个 Iterator<Map.Entry<Integer, String>>
.
您遇到的错误 java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to [Ljava.lang.Object;
是 TestNG 试图将第一个元素 return 由迭代器从 dp2()
转换为 Object[]
但Map.Entry<K, V>
无法转换为 Object[]
.
即您不能在映射的条目集上使用迭代器作为 TestNG 数据提供者。但是,您可以转换数据。例如:
@DataProvider(name = "dp2", parallel = true)
public Iterator<Object[]> dp2() {
return FluentIterable.from(this.map.entrySet())
.transform(new Function<Map.Entry<Integer, String>, Object[]>() {
@Override
public Object[] apply(Map.Entry<Integer, String> input) {
return new Object[]{input.getKey(), input.getValue()};
}
})
.iterator();
}
public class DemoTest {
private static final ThreadLocal<WebDriver> webDriverThreadLocal= new InheritableThreadLocal<>();
private String baseUrl;
Random random = new Random();
int no;
private final Map<Integer, String> map =new LinkedHashMap<Integer, String>();
@Test(dataProvider = "dp1")
public void f(Integer n, String s) {
WebDriver driver = webDriverThreadLocal.get();
no= random.nextInt(4);
map.put(no, "1234567");
}
@Test(dependsOnMethods = {"f"}, dataProvider = "dp2")
public void f1(Integer uname, String password){
System.out.println("uname:"+uname+" password:"+password);
System.out.println("In f1 id:"+Thread.currentThread().getId());
}
@BeforeMethod
public void beforeMethod() {
WebDriver driver= new FirefoxDriver();
// driver = ThreadGuard.protect(new FirefoxDriver());
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
webDriverThreadLocal.set(driver);
System.out.println("Before method id:"+Thread.currentThread().getId());
}
@AfterMethod
public void afterMethod() {
WebDriver driver = webDriverThreadLocal.get();
System.out.println("After method id:"+Thread.currentThread().getId());
System.out.println("");
if(driver != null ) {
driver.quit();
// driver.close();
}
}
@DataProvider(name ="dp1" ,parallel=true)
public Object[][] dp() {
return new Object[][] {
new Object[] { 1, "a" },
new Object[] { 2, "b" },
new Object[] { 3, "c" },
new Object[] { 4, "d" },
};
}
@DataProvider(name="dp2" , parallel=true)
public Iterator dp2() {
return this.map.entrySet().iterator();
}
- 测试 f1 依赖于测试 f。
- f1 生成随机数和一个字符串,作为测试 f1 的输入。
- 我想将映射迭代器从测试 f 传递到测试 f1。
这是我目前尝试过的方法。
我收到以下错误:
java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to [Ljava.lang.Object;
如何解决这个问题?
TestNG 数据提供者必须 return Object[][]
或 Iterator<Object[]>
但 dp2()
return 两者都不是。
this.map.entrySet().iterator()
return 一个 Iterator<Map.Entry<Integer, String>>
.
您遇到的错误 java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to [Ljava.lang.Object;
是 TestNG 试图将第一个元素 return 由迭代器从 dp2()
转换为 Object[]
但Map.Entry<K, V>
无法转换为 Object[]
.
即您不能在映射的条目集上使用迭代器作为 TestNG 数据提供者。但是,您可以转换数据。例如:
@DataProvider(name = "dp2", parallel = true)
public Iterator<Object[]> dp2() {
return FluentIterable.from(this.map.entrySet())
.transform(new Function<Map.Entry<Integer, String>, Object[]>() {
@Override
public Object[] apply(Map.Entry<Integer, String> input) {
return new Object[]{input.getKey(), input.getValue()};
}
})
.iterator();
}