我正在处理与使用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)
答案 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
我的代码捕获。
更改此问题解决了我的问题并再次感谢您的时间:)