2012-09-10 29 views
10

Tôi đang cố gắng tìm hiểu về các thư viện mô phỏng khác nhau và PowerMock (cụ thể là phần mở rộng EasyMock) tiếp theo trong danh sách. Tôi đang cố gắng để giả lập một constructor và các ví dụ được cung cấp không có phản ứng tương tự khi tôi cố gắng để tái tạo chúng. Theo như tôi có thể nói, nó không bao giờ mocks constructor và chỉ tiến hành như thể nó đã được bình thường.Kỳ vọng của PowerMockNew() không phải là chế nhạo một hàm tạo như mong đợi

Đây là lớp thử nghiệm:

@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); 
    } 

} 

tôi đã cố gắng thay thế các "thử nghiệm" với một EasyMock.isA (String.class), nhưng nó mang lại kết quả tương tự.

Đây là 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"; 
    } 
} 

Các "Writer" là gì khác hơn là một cái vỏ của một lớp:

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

    public Writer() throws IOException{ 
    } 
} 

Khi thử nghiệm được chạy, nó in ra "trở lại mà không cần ném ", cho thấy ngoại lệ không bao giờ bị ném.

Trả lời

21

Bạn cần chuẩn bị các lớp đó đang kêu gọi các nhà xây dựng là tốt, vì thế PowerMock biết để mong đợi một cuộc gọi constructor chế giễu. Hãy thử cập nhật mã của bạn với các thông tin sau:

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

Cảm ơn, tôi đã không nhận ra rằng đối tượng được gọi là hàm tạo cần được bao gồm. – AdamSpurgin

+0

Tôi chạy vào cùng một vấn đề ... Chính xác những gì tôi đã mất tích :) –

+0

Cảm ơn bạn rất nhiều, tôi đã vật lộn trong một thời gian dài cho đến khi tôi tìm thấy câu trả lời này. – OQJF

1

Bạn cần tạo một đối tượng giả:

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

Tôi không cố gắng tạo đối tượng giả, tôi đang cố gắng chặn nhà xây dựng và ném ngoại lệ vào vị trí của nó. phần "tính năng khác" của [trang này] (http://code.google.com/p/powermock/wiki/MockConstructor) là những gì tôi đang nhắm tới. – AdamSpurgin

+1

xin lỗi, tôi thấy những gì bạn đang cố gắng làm. Tôi chỉ thử mã của bạn trên JUnit 4 và nó in ra "ném từ giả" (những gì bạn mong đợi). Bạn đang sử dụng TestNG bởi cơ hội nào? Tôi không quen thuộc với TestNG nhưng khi tôi chạy nó bằng TestNG, tôi đã nhận được "trả lại mà không cần ném" –

+0

Tôi đang sử dụng Junit4. Tôi không thể nghĩ ra bất cứ điều gì khiến nó không hoạt động. – AdamSpurgin

Các vấn đề liên quan