2013-04-05 30 views
17

Tôi đang sử dụng mockito. Tôi muốn ném RuntimeException khi phương thức chưa được cài đặt được gọi. Có cách nào để thực hiện việc này không?ném RuntimeException khi gọi phương thức chưa được khóa

+0

tại sao bạn muốn thực hiện điều đó? – Woot4Moo

+0

Chính xác, ý của bạn là gì với "phương pháp chưa được khóa" trong ngữ cảnh này? Tất cả các phương thức trong một lớp được mô phỏng khi sử dụng 'mock (...)'/'@ Mock'. –

+5

Bởi vì tôi thường quên thử một số phương pháp. Các ngoại lệ có thể giúp tìm ra các phương pháp này. – Hlib

Trả lời

20

Bạn có thể đặt câu trả lời mặc định cho mô hình. Tất cả các phương thức không được phân tích sẽ sử dụng câu trả lời mặc định này.

public void testUnstubbedException() { 
    // Create a mock with all methods throwing a RuntimeException by default 
    SomeClass someClass = mock(SomeClass .class, new RuntimeExceptionAnswer()); 

    doReturn(1).when(someClass).getId(); // Must use doReturn 

    int id = someClass.getId(); // Will return 1 

    someClass.unstubbedMethod(); // Will throw RuntimeException 
} 

public static class RuntimeExceptionAnswer implements Answer<Object> { 

    public Object answer(InvocationOnMock invocation) throws Throwable { 
     throw new RuntimeException (invocation.getMethod().getName() + " is not stubbed"); 
    } 

} 

Lưu ý rằng bạn không thể sử dụng when với chức năng này, vì phương pháp này được gọi là trước when (How does mockito when() invocation work?) và nó sẽ ném một RuntimeException trước khi mô hình chuyển sang chế độ stubbing.

Vì vậy, bạn phải sử dụng doReturn để làm việc này.

+2

Cảm ơn bạn! Nhưng khi tôi đã chèn 'when (someClass.unmpokedMethod()). ThanReturn ("huerga")' nó tiếp tục ném ngoại lệ – Hlib

+4

Bạn phải sử dụng 'doReturn' thay vì' khi'. Tôi đã chỉnh sửa câu trả lời của mình bằng giải pháp này. –

+2

Cảm ơn! Điều này thực sự hoạt động! – Hlib

0

Bạn thử toàn bộ lớp và kết quả là tất cả các phương thức sẽ trả về giá trị rỗng.

Sau đó, bạn có thể sử dụng doReturn(...) để thay đổi hành vi đó. Tương tự, bạn có thể sử dụng doThrow(...) để thực hiện (như tôi chỉ nhớ void) các phương thức ném ngoại lệ.

Điều đó có trả lời câu hỏi của bạn không?

+1

Tôi nghĩ rằng anh ta muốn chắc chắn rằng tất cả các phương pháp được chế giễu, ví dụ như Mockito ném một ngoại lệ nếu một phương pháp chưa được chế giễu –

+2

Có! Nhưng tôi muốn đảm bảo rằng tất cả các phương thức sẽ được gọi sẽ được mô phỏng. – Hlib

+0

Tất cả các phương thức trong một lớp được mô phỏng _are_ được mô phỏng - theo định nghĩa. –

12

Cách tốt nhất để làm điều này là với các phương pháp tĩnh verifyNoMoreInteractionsignoreStubs. Hãy gọi những điều này sau phần "hành động" của bài kiểm tra của bạn; và bạn sẽ nhận được một thất bại nếu bất kỳ phương pháp unstubbed được gọi nhưng không được xác minh.

verifyNoMoreInteractions(ignoreStubs(myMock)); 

Điều này được mô tả tại https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification mặc dù tôi tin rằng ví dụ mã hiện có chứa lỗi.

+0

+1 Tôi thích giải pháp này để khai thác. –

+4

Điều này không giúp ích gì nếu thử nghiệm của bạn đã bị lỗi trước thời điểm này do sự thiếu cân nhắc gây ra bởi một cuộc gọi đến một phương thức chưa được khóa. –

+0

Tuyệt vời. Tự hỏi tại sao điều này ẩn trong tài liệu. –

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