Mockito doThrow()没有按照我的预期行事

时间:2015-06-01 15:22:57

标签: java unit-testing junit mockito stubbing

我正在处理与使用WebDrivers,WebElements等项目相关的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与实际方法中的相同,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)

2 个答案:

答案 0 :(得分:0)

我认为您应该重新考虑代码以使测试更容易。如果是遗留代码,那么你就是自己的代码。

方法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)

  }
}

另外,我强烈怀疑它在调用findElement(...)期间抛出了异常而不是点击期间。但是,我猜你更接近代码。

答案 1 :(得分:0)

感谢您的所有想法。

当我使用alt + enter时,我只是“注意”。

代码工作正常,除了我的测试方法抛出了java.util.NoSuchElementException而不是org.openqa.selenium.NoSuchElementException我的代码捕获。

更改此问题解决了我的问题并再次感谢您的时间:)