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
Trả lời
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.
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?
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 –
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
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. –
Cách tốt nhất để làm điều này là với các phương pháp tĩnh verifyNoMoreInteractions
và ignoreStubs
. 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.
+1 Tôi thích giải pháp này để khai thác. –
Đ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. –
Tuyệt vời. Tự hỏi tại sao điều này ẩn trong tài liệu. –
tại sao bạn muốn thực hiện điều đó? – Woot4Moo
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'. –
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