2016-11-24 73 views
0

我希望能够为我的Selenium集成测试进行单元测试,并且我需要能够模拟硒Select对象。如何使用mockito模拟org.openqa.selenium.support.ui.Select?

我的测试方法是:

protected int findOptionByIgnoreCaseText(String value, Select dropDown) { 
... 
} 

我的测试方法是:

@Test 
public void testFindOptionByIgnoreCaseText() { 
    WebElement mockElement = Mockito.mock(WebElement.class,....??? "Peter","Stéphane","Katy","Brad" 
    Select dropDown = new Select(mockElement); 
    Assert.assertEquals("OK", 1, step.findOptionByIgnoreCaseText("Peter", dropDown); 
    Assert.assertEquals("OK", 2, step.findOptionByIgnoreCaseText("Stephane", dropDown); 
    Assert.assertEquals("OK", 2, step.findOptionByIgnoreCaseText("Stéphane", dropDown); 
    Assert.assertEquals("OK", 3, step.findOptionByIgnoreCaseText("Katy", dropDown); 
    Assert.assertEquals("OK", 4, step.findOptionByIgnoreCaseText("Brad", dropDown); 
} 

回答

0

我找到了解决办法:

我看硒官方doc here

@Test 
public void testFindOptionByIgnoreCaseText() { 
    final WebElement peterOption = mockOption("Peter"); 
    final WebElement stephaneOption = mockOption("Stephane"); 
    final WebElement noelOption = mockOption("Noël"); 
    final WebElement katyOption = mockOption("Céline"); 
    final WebElement bradOption = mockOption("Brad "); 
    final WebElement pierreOption = mockOption(" Pierre"); 
    final List<WebElement> options = Arrays.asList(peterOption, stephaneOption, noelOption, katyOption, bradOption, pierreOption); 

    final WebElement element = Mockito.mock(WebElement.class); 
    Mockito.when(element.getTagName()).thenReturn("select"); 
    Mockito.when(element.findElements(By.tagName("option"))).thenReturn(options); 
    Select select = new Select(element); 

    Assert.assertEquals("OK", 0, step.findOptionByIgnoreCaseText("Peter", select)); 

    Assert.assertEquals("OK", 1, step.findOptionByIgnoreCaseText("Stephane", select)); 
    Assert.assertEquals("OK", 1, step.findOptionByIgnoreCaseText(" Stephane", select)); 
    Assert.assertEquals("OK", 1, step.findOptionByIgnoreCaseText("Stephane ", select)); 
    Assert.assertEquals("OK", 1, step.findOptionByIgnoreCaseText("Stéphane", select)); 

    Assert.assertEquals("OK", 2, step.findOptionByIgnoreCaseText("Noël", select)); 
    Assert.assertEquals("OK", 2, step.findOptionByIgnoreCaseText("Noel", select)); 

    Assert.assertEquals("OK", 3, step.findOptionByIgnoreCaseText("Celine", select)); 
    Assert.assertEquals("OK", 3, step.findOptionByIgnoreCaseText("Céline", select)); 

    Assert.assertEquals("OK", 4, step.findOptionByIgnoreCaseText("Brad", select)); 
    Assert.assertEquals("OK", 4, step.findOptionByIgnoreCaseText(" Brad", select)); 
    Assert.assertEquals("OK", 4, step.findOptionByIgnoreCaseText("Brad ", select)); 
    Assert.assertEquals("OK", 4, step.findOptionByIgnoreCaseText(" Brad ", select)); 

    Assert.assertEquals("OK", 5, step.findOptionByIgnoreCaseText("Pierre", select)); 
    Assert.assertEquals("OK", 5, step.findOptionByIgnoreCaseText(" Pierre", select)); 
    Assert.assertEquals("OK", 5, step.findOptionByIgnoreCaseText("Pierre ", select)); 
    Assert.assertEquals("OK", 5, step.findOptionByIgnoreCaseText(" Pierre ", select)); 
} 

private WebElement mockOption(String name) { 
    final WebElement option = Mockito.mock(WebElement.class, name); 
    Mockito.when(option.getText()).thenReturn(name); 
    return option; 
} 

我的测试方法是:

protected int findOptionByIgnoreCaseText(String value, Select dropDown) { 
    int index = 0; 
    for (WebElement option : dropDown.getOptions()) { 
     if (Normalizer.normalize(option.getText(), Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").trim() 
       .equalsIgnoreCase(Normalizer.normalize(value, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").trim())) { 
      return index; 
     } 
     index++; 
    } 
    return -1; 
}