2015-06-01 88 views
0

我正在使用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) 
+1

請發佈完整的堆棧跟蹤。 –

+2

同時顯示如何創建所有對象。奇怪的是,被測試的對象被稱爲mockedObjectOfMyClass。你不應該嘲笑被測試的物體。另外,By.id()是一個靜態方法,並且你沒有嘲笑它,所以向它傳遞anyString()將不會像你想象的那樣工作。 –

+0

是否有可能從上一行拋出'NoSuchElementException',從而啓動'Mockito.when(...)'?具體來說,'By.id(Mockito.anyString())'可以拋出它嗎?這是我的猜測。 – yshavit

回答

0

感謝您的所有想法。

我剛剛有一個「小心使用alt +進入」時刻。

代碼工作得很好,除了我的測試方法扔了java.util.NoSuchElementException而不是我的代碼捕獲org.openqa.selenium.NoSuchElementException

更改這個解決了我的問題,並再次感謝您的時間:)

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(...)期間引發異常,而不是在點擊過程中拋出異常。但是,我猜你比較接近代碼。

相關問題