我正在做一个与使用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
。
修改这个解决了我的问题,再次感谢您的时间:)