2011-09-20 16 views
22

Tôi đang cố gắng sử dụng Powermock và Mockito để giả lập một phương pháp tĩnh void để ném ngoại lệ như dưới đây. Nhưng tôi đã gặp một vấn đề. Trừ khi tôi thực hiện hai invocations của Adder.add() với cùng một đối số, các giả lập IOException sẽ không được ném.Làm thế nào để giả lập một phương pháp tĩnh void để ném ngoại lệ với Powermock?

BTW, tôi đã thêm @RunWith(PowerMockRunner.class)@PrepareForTest(Adder.class) vào lớp kiểm tra đơn vị.

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 
} 

Xin cảm ơn trước. :)

Trả lời như sau.

Sau khi tham khảo tại đây http://code.google.com/p/powermock/issues/detail?id=278, trên thực tế Adder.add (12) ở trên là một phần của việc thiết lập phương pháp tĩnh giả. Nó có nghĩa là khi gọi Adder.add() với đối số 12, IOException sẽ được ném. Thật khó hiểu, đúng không? :) Vì vậy, nó nên được viết như dưới đây.

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

Trả lời

23

Trả lời như sau.

Sau khi tham khảo tại đây http://code.google.com/p/powermock/issues/detail?id=278, trên thực tế Adder.add (12) ở trên là một phần của việc thiết lập phương pháp tĩnh giả. Nó có nghĩa là khi gọi Adder.add() với đối số 12, IOException sẽ được ném. Thật khó hiểu, đúng không? :) Vì vậy, nó nên được viết như dưới đây.

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

EDIT:
Link là chết, hãy thử Internet Archive một thay thế.

+2

Điều này không trực quan chút nào. Đấu tranh để làm việc này. Cảm ơn vì tiền hỗ trợ. – Dhiraj

+1

Lưu ý rằng 'Adder.add (anyInt());' không phải là những gì kích hoạt ngoại lệ ở đây, nó áp dụng nó cho các cuộc gọi đến 'Adder.add()'. – sjngm

0

Bạn đã quên đặt PowerMock ở chế độ phát lại chưa?

How to Mock Static methods.

mỗi liên kết của bạn ...

Làm thế nào để xác minh hành vi Xác minh một phương pháp tĩnh được thực hiện theo hai bước. Đầu tiên hãy gọi PowerMockito.verifyStatic() để bắt đầu xác minh hành vi và gọi phương thức tĩnh bạn muốn xác minh. Ví dụ.

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

Quan trọng: Bạn cần gọi verifyStatic() cho mỗi phương pháp xác minh.

+0

tôi đọc hướng dẫn ở đây kể từ khi tôi đang sử dụng Mockito. http://code.google.com/p/powermock/wiki/MockitoUsage13 Nó không đề cập đến tôi phải sử dụng chế độ phát lại. – Smartmarkey

+0

Rất tiếc. Đã thấy PowerMockito và đọc PowerMock. –

+0

Đã chỉnh sửa theo liên kết của bạn –

1

Hoặc

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