2012-12-04 83 views
2

我試圖嘲笑靜態方法Thread.sleep(1);當它被調用時返回一個InterruptedException。我發現了一個似乎解決了我的問題的SO問題,但是在將我的代碼設置爲與該問題的答案相同之後,它仍然無法工作。Powermockito不會拋出一個異常時,嘲笑靜態void

所謂的問題,我發現是:How to mock a void static method to throw exception with Powermock?

這裏是我的方法,我想測試的片段:

try { 
    Thread.sleep(1); 
} catch (InterruptedException ie) { 
    LOGGER.error("failure to sleep thread for 1 millisecond when persisting 
     checkpoint. exception is: " + ie.getMessage()); 
} 

下面是從我的測試類的一個片段,顯示我的企圖模擬了Thread.sleep(1)做我想做什麼:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Thread.class) 
public class TestCheckpointDaoNoSQL { 

     @Test 
     public void test() throws InterruptedException { 

     PowerMockito.mockStatic(Thread.class); 
     PowerMockito.doThrow(new InterruptedException()).when(Thread.class); 
     Thread.sleep(1); 
     } 
} 

我也試過嘲諷InterruptedException的,而不是拋出創建一個新的,但是這並沒有幫助。我可以告訴該異常沒有被拋出,因爲ECLEMMA沒有爲該方法的那部分顯示代碼覆蓋範圍,並且我通過該方法進行了調試,以驗證catch語句永遠不會被擊中。

感謝您看看我的問題!

+1

您的代碼看起來幾乎完全像您發佈的鏈接中問題中的代碼。你有沒有嘗試過一些看起來像那個人提出的答案? – femtoRgon

+0

它看起來幾乎完全像那個代碼,因爲我複製了他們的解決方案。我不確定它是否對我不起作用,因爲我做了不同的/錯誤的事情,或者它不能專門用於Thread.sleep。 – CorayThan

+0

不要只是複製代碼,請閱讀他們所寫的內容。我認爲你錯過了他們解決方案的背景。 – femtoRgon

回答

2

讀答案指示給我,說你還沒有真正執行了Thread.sleep然而,而是剛剛完成設置模擬:

@Test 
    public void test() throws InterruptedException { 

    PowerMockito.mockStatic(Thread.class); 
    PowerMockito.doThrow(new InterruptedException()).when(Thread.class); 
    Thread.sleep(1); //This is still setting up the mock, not actually invoking the method. 
    } 

注意有什麼說,朝頂:「除非使用相同的參數對Adder.add()進行兩次調用,否則不會拋出模擬的IOException。」後來,「實際上Adder.add(12)是建立模擬靜態方法的一部分」。

您應該在Thread.sleep的第一個「調用」中使用像anyInt()這樣的匹配器,然後繼續執行測試。

+0

我用anyInt()試過了,我沒有在我的斷言中包含我的assert語句,它不會超出Thread.sleep方法,所以我認爲我已經完成了所有這些。對不起,我應該在我原來的問題上更加完整! – CorayThan

+0

啊,好吧。認爲這是你的測試方法的全部範圍。您提到調試該方法。你有沒有試過打電話給被測單元中的Thread.sleep(1),看看那裏執行了什麼(不管它執行實際的Thread.sleep還是步入某種Mockito體系結構)? – femtoRgon