Mockito doThrow()没有像我期望的那样工作



我正在做一个与使用WebDrivers、webelement等项目相关的UnitTests。我得到了相当远的嘲笑连接和一切,但有一个问题,我卡住了。

在我的类中有一个try块,看起来类似于

class MyClass {
    myMethod() {
        (...)
        try {
            WebElement element = webDriver.findElement(By.id(elementId));
            element.click();
        } catch (NoSuchElementException e) {
            throw new MyException("Unable to locate element!", e);
        }
        (...)
    }
}

现在我试着写一个测试用例,该元素没有找到

class MyTestClass {
    testMyMethod() {
        WebElement mockedElement = Mockito.mock(WebElement.class);
        Mockito.when(mockedWebDriver.findElement(By.id(Mockito.anyString()))).thenReturn(mockedElement);
        Mockito.doThrow(NoSuchElementException.class).when(mockedAllowElement).click();
        try {
            mockedObjectOfMyClass.myMethod()
            Assert.fail();
        } catch (MyException e) {
            Assert.assertTrue(e.getCause() instanceof NoSuchElementException);
        }
    }
}

我的问题是,我得到可爱的NoSuchElementException而不是预期的MyException:

    java.util.NoSuchElementException
    Process finished with exit code -1

我检查了所有我能想到的。在测试期间,测试方法中所有模拟对象的hashCodes与实际方法中的hashCodes相同,myMethod运行到"element.click()"。但是异常不会被catch块捕获。

我一定是错过了什么,我对Mockito和UnitTesting很陌生。

希望我在缩短我的逻辑时没有遗漏任何重要的东西:)。

如有任何建议或提示,我将不胜感激

(编辑)

感谢您的快速响应,下面是完整的堆栈跟踪:

java.util.NoSuchElementException: this is mine
    at yandex.TokenGeneratorTest.testGetVerificationCodeNoElement(TokenGeneratorTest.java:308)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我认为你应该重构你的代码,使测试更容易。如果是遗留代码,那么你就得自己处理了。

方法testMyMethod()可以要求webDriver和异常NoSuchElementException声明被抛出。

所以有像

这样的东西
 class MyTestClass  {
    testMyMethod(WebDriver webDriver) throws NoSuchElementException { 
      ...
    }

现在你的测试可以如下所示:

class MyTestClass {
     @Test(expected = NoSuchElementException.class)
     testMyMethod() {
         WebDriver mockedWebDriver = Mockito.mock(WebDriver.class);
         WebElement mockedElement = Mockito.mock(WebElement.class);
         Mockito.doThrow(NoSuchElementException.class).when(mockedElement).click();
    Mockito.when( mockedWebDriver.findElement( By.id( Mockito.anyString()))).thenReturn( mockedElement);
    MyClass myClass = new MyClass();
    myClass.myMethod(mockedWebDriver)
  }
}

另外,我高度怀疑是在调用finelement(…)期间抛出异常,而不是在单击期间抛出异常。但是我猜你离代码更近了

谢谢你的建议。

我刚刚遇到了一个"使用alt + enter时要小心"的时刻。

代码工作得很好,除了我的测试方法抛出了一个java.util.NoSuchElementException而不是我的代码捕获的org.openqa.selenium.NoSuchElementException

修改这个解决了我的问题,再次感谢您的时间:)

相关内容

  • 没有找到相关文章

最新更新