【问题标题】:How to use mockito to mock webdriver?如何使用mockito来模拟webdriver?
【发布时间】:2014-06-16 11:18:14
【问题描述】:

我希望能够为我的 Selenium 集成测试进行单元测试,为此我需要能够模拟驱动程序和测试所需的元素,这是一个返回名称的函数的快速示例元素。

public class demo {

  private WebDriver mockDriver;
  private WebElement mockElement;

  @Before
  public void setUp(){
    this.mockDriver = mock(WebDriver.class);
    this.mockElement = mock(WebElement.class, withSettings().name("elementName"));
    when(this.mockDriver.findElement(By.id("testmock"))).thenReturn(mockElement);
  }

  public String getName(String id){
    WebElement testElement = mockDriver.findElement(By.id(id));
    return testElement.getAttribute("name");
  }

  @Test
  public void assertElementName() throws InterruptedException {
    Assert.assertTrue(getName("testmock").equals("elementName"));
  }
}

这给了我一个java.lang.NullPointerExceptiongetName() 的回报。 我显然用错了,但我不知道怎么做。有这方面经验的人可以为我指明正确的方向吗?

【问题讨论】:

  • 你到底为什么要模拟 WebDriver?我不明白您对“单元测试 [ing] 我的 Selenium 集成测试”的评论。
  • 因为我想确保我使用 webdriver 的函数是正确的。就像在这种情况下,如果我没有模拟驱动程序来返回我的预定义元素,则无法测试函数 getName。

标签: java selenium webdriver mockito


【解决方案1】:

你误解了这段代码的作用:

this.mockElement = mock(WebElement.class, withSettings().name("elementName"));

withSettings() 子句为模拟对象提供了一个名称,这意味着 Mockito 生成的某些错误消息将使用此名称。您没有WebElement 对象上设置任何属性。

所以...当您的代码到达此部分时:

return testElement.getAttribute("name");

它返回 null 因为没有具有该值的属性。如果你想拥有一个属性,那么你需要添加如下内容:

when(this.mockElement.getAttribute("name")).thenReturn("elementName");

【讨论】:

  • 好吧,我明白了,我确实完全误解了那部分。所以我必须用“when”子句来构建我的元素?
  • @user2968166 是的,任何模拟对象都是用一系列when 子句来定义行为的。如果没有 when 子句,Mockito 会返回一个默认值(例如 false0null)。
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多