我正在使用WebDrivers,WebElements等項目來處理我的UnitTests。我嘲笑連接和一切,但有一個問題,我堅持。Mockito doThrow()沒有像我期望的那樣工作
我在我的班級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)
請發佈完整的堆棧跟蹤。 –
同時顯示如何創建所有對象。奇怪的是,被測試的對象被稱爲mockedObjectOfMyClass。你不應該嘲笑被測試的物體。另外,By.id()是一個靜態方法,並且你沒有嘲笑它,所以向它傳遞anyString()將不會像你想象的那樣工作。 –
是否有可能從上一行拋出'NoSuchElementException',從而啓動'Mockito.when(...)'?具體來說,'By.id(Mockito.anyString())'可以拋出它嗎?這是我的猜測。 – yshavit