2011-09-20 385 views
22

我想用Powermock和Mockito來模擬一個無效的靜態方法來拋出異常,如下所示。但我遇到了一個問題。除非我使用相同的參數對Adder.add()進行兩次調用,否則將不會拋出嘲諷的IOException如何模擬一個無效的靜態方法來拋出Powermock異常?

順便說一句,我已經將@RunWith(PowerMockRunner.class)@PrepareForTest(Adder.class)添加到單元測試類。

class Adder{ 
    public static void add(int i) throws IOException{ 
     return; 
    } 
} 

@Test 
public void testAdder() throws IOException{ 
    PowerMockito.mockStatic(Adder.class); 
    PowerMockito.doThrow(new IOException()).when(Adder.class); 
    Adder.add(12); 
    try { 
     Adder.add(11); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // assert things 
} 

在此先感謝。 :)

答案如下。

經過這裏的諮詢http://code.google.com/p/powermock/issues/detail?id=278,其實Adder.add(12)以上是設置模擬靜態方法的一部分。這意味着當使用參數12調用Adder.add()時,將引發IOException。這很難理解,對吧? :)所以它應該寫如下。

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

回答

23

答案如下。

經過這裏的諮詢http://code.google.com/p/powermock/issues/detail?id=278,其實Adder.add(12)以上是設置模擬靜態方法的一部分。這意味着當使用參數12調用Adder.add()時,將引發IOException。這很難理解,對吧? :)所以它應該寫如下。

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

編輯:
鏈接是死的,儘量Internet Archive一個來代替。

+2

這根本不直觀。努力得到這個工作。謝謝你的提示。 – Dhiraj

+1

請注意,'Adder.add(anyInt());'不是觸發異常的地方,它適用於調用'Adder.add()'。 – sjngm

0

你忘了把PowerMock放在重放模式嗎?

How to Mock Static methods.

根據您的鏈接...

如何驗證一個靜態方法的行爲 驗證兩個步驟完成。首先調用PowerMockito.verifyStatic()開始驗證行爲,並調用您要驗證的靜態方法。例如。

PowerMockito.verifyStatic(); 
Static.firstStaticMethod(param); 

重要提示:您需要爲每個方法驗證調用verifyStatic()

+0

我閱讀教程在這裏,因爲我使用的Mockito。 http://code.google.com/p/powermock/wiki/MockitoUsage13它沒有提到我必須使用重放模式。 – Smartmarkey

+0

糟糕。看PowerMockito並閱讀PowerMock。 –

+0

根據您的鏈接編輯 –

1

或者

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12)); 
相關問題