2015-12-16 77 views
1
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的字符串。
  • 我想將map Iterator從測試f傳遞到測試f1。

這是我到目前爲止嘗試過的。通過數據提供程序返回映射的迭代器

我得到以下錯誤:

java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to [Ljava.lang.Object;

如何解決這個問題?

+0

你從哪裏得到錯誤?哪條線?是不是因爲你在dp()中使用了Object的二維數組? – Asoub

回答

0

TestNG數據提供者必須返回Object[][]Iterator<Object[]>,但dp2()不返回。

this.map.entrySet().iterator()返回Iterator<Map.Entry<Integer, String>>

你得到,java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to [Ljava.lang.Object;錯誤,是TestNG的嘗試投放從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(); 

} 
+0

這個工作,但測試f1只執行兩次,而不是4 –

+0

那麼你使用的地圖,這意味着如果你生成相同的隨機數,然後你覆蓋地圖中現有的條目,而不是添加一個新的。您可以使用Map.Entry列表,Object []列表或番石榴multimap列表來代替地圖。你爲什麼要創建一個隨機數字?如果你試圖從dp1重新排列元素的順序,那麼你可以建立一個列表,然後使用Collections.shuffle。 – mfulton26

+0

我現在不是創建隨機的,所以它工作正常。但是,您能否提出一種將地圖傳遞給測試方法的簡單方法 –