2012-09-10 21 views
10

我試圖學習各種嘲諷庫的來龍去脈,PowerMock(特別是EasyMock擴展)位於列表中。我試圖嘲笑一個構造函數,當我嘗試複製它們時,提供的示例沒有相同的響應。據我所知,它從不嘲笑構造函數,只是像正常一樣進行。PowerMock的expectNew()並不像預期的那樣嘲諷構造函數

這是測試類:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Writer.class}) 
public class FaultInjectionSituationTest { 

    @Test 
    public void testActionFail() throws Exception { 
     FaultInjectionSituation fis = new FaultInjectionSituation(); 
     PowerMock.expectNew(Writer.class, "test") 
      .andThrow(new IOException("thrown from mock")); 
     PowerMock.replay(Writer.class); 
     System.out.println(fis.action()); 
     PowerMock.verify(Writer.class); 
    } 

} 

我試着用EasyMock.isA(String.class)代替「測試」,但它會產生相同的結果。

這是FaultInjectionSituation:

public class FaultInjectionSituation { 

    public String action(){ 
     Writer w; 
     try { 
      w = new Writer("test"); 
     } catch (IOException e) { 
      System.out.println("thrown: " + e.getMessage()); 
      return e.getLocalizedMessage(); 
     } 
     return "returned without throw"; 
    } 
} 

的「作家」無非是一類的外殼:

public class Writer { 
    public Writer(String s) throws IOException { 
    } 

    public Writer() throws IOException{ 
    } 
} 

當測試運行時,它打印出「返回不拋「,表明這個例外從未拋出。

回答

21

你需要準備正在調用構造函數和類,所以PowerMock知道要期待一個嘲笑構造函數調用。嘗試更新您的代碼與以下內容:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Writer.class, FaultInjectionSituation.class}) 
public class FaultInjectionSituationTest { 
// as before 
} 
+1

謝謝,我沒有意識到調用構造函數的對象也需要包含在內。 – AdamSpurgin

+0

我遇到了同樣的問題......正是我錯過了:) –

+0

非常感謝,我掙扎了很長一段時間,直到我找到了答案。 – OQJF

1

您需要先創建一個模擬對象:

Writer mockWriter = PowerMock.createMock(Writer.class) 
PowerMock.expectNew(Writer.class, "test").andReturn(mockWriter) 
+0

我不想創建一個模擬對象,我試圖攔截構造函數並在其位置引發異常。 [本頁](http://code.google.com/p/powermock/wiki/MockConstructor)的「更多功能」部分就是我的目標。 – AdamSpurgin

+1

對不起,我看到你正在嘗試做什麼。我只是在JUnit 4上試過你的代碼,它打印出「從模擬中拋出」(你所期望的)。你有沒有機會使用TestNG?我對TestNG並不熟悉,但是當我使用TestNG運行它時,我得到了「沒有丟失的返回」 –

+0

我正在使用Junit4。我想不出任何會導致它無法工作的事情。 – AdamSpurgin