Thật dễ dàng để xác minh rằng tương tác cụ thể (gọi phương thức cụ thể) xảy ra trên một đối tượng giả trong Mockito, và có verifyZeroInteractions()
để kiểm tra xem không có tương tác nào xảy ra. Giả sử tôi đang thử nghiệm một giao diện như giao diện của trình ghi nhật ký, với các phương thức như info()
, warn()
, error()
v.v. Trong một trường hợp cụ thể, tôi biết một trong những phương pháp này nên được gọi, nhưng tôi không thực sự quan tâm đến phương thức nào. Có cách nào nhỏ gọn để kiểm tra xem có bất kỳ tương tác nào với đối tượng giả đã xảy ra mà không cần chỉ rõ phương pháp chính xác nào nên được gọi? Hoặc có lẽ một cơ chế như vậy là không cần thiết bởi vì "cách Mockito" của thử nghiệm này sẽ khác với những gì tôi tưởng tượng?Có thể xác minh tương tác tùy ý bằng Mockito một cách nhỏ gọn không?
Trả lời
Nếu bạn có thể tạo ra đối tượng logger từ lớp đang thử nghiệm, không có lý do gì bạn không thể thực hiện kiểm tra của riêng mình đối với Giao diện Đăng nhập sẽ ghi lại phương thức nào đã được thực hiện và tiêm nó như một phần của thiết lập thử nghiệm của bạn.
Thư viện giả làm rất tốt, nhưng đôi khi có trường hợp góc như bạn đã tìm thấy nơi chúng có thể không đáp ứng nhu cầu của bạn.
Nếu bạn viết thực hiện của riêng bạn để thử nghiệm như thế này, và tiêm nó vào lớp thử nghiệm yourt dưới kiểm tra, sau đó bạn có thể khẳng định trên getCount() > 0
public class LoggerTestSupportImpl implements ILogger {
private int count = 0;
@Override
public int getCount() {
return count;
}
@Override
public void info(String message) {
count++;
}
@Override
public void warn(String message) {
count++;
}
}
Với log4j, để kiểm tra các logger tôi làm việc thiết lập sau:
@Mock private Appender log4jAppender;
private Logger logger;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
Logger root = Logger.getRootLogger();
if (!root.getAllAppenders().hasMoreElements()) {
// No appenders means log4j is not initialized!
BasicConfigurator.configure();
}
logger = Logger.getLogger(MyClassWhichLogs.class);
logger.addAppender(log4jAppender);
}
và sau đó trong thử nghiệm của tôi, tôi làm như sau:
verifyZeroInteractions(log4jAppender);
hoặc
verify(log4jAppender).doAppend(any(LoggingEvent.class);
Nếu bạn cần phải kiểm tra các giá trị được ghi lại, bạn có thể cung cấp một trình cho phép thay thế:
ArgumentCaptor<LoggingEvent> logCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
verify(log4jAppender).doAppend(logCaptor.capture());
assertTrue(logCaptor.getValue().contains("my text to match");
Mặc dù điều này không nhất thiết phải trả lời câu hỏi tổng quát (Tôi không nghĩ những gì bạn đang tìm kiếm tồn tại), nó có thể giải quyết vấn đề cụ thể này để kiểm tra đăng nhập.
- 1. Mockito xác minh không tương tác nhưng bỏ qua getters
- 2. Xác minh Mockito Không Failing
- 3. Mockito - xác minh rằng không có phương pháp nào của cộng tác viên được gọi là
- 4. Minh bạch trong khung nhỏ gọn
- 5. Mockito. Xác minh phương pháp param là một lớp paticular
- 6. Cách làm cho Bootstrap trông gọn hơn "Nhỏ gọn"
- 7. Sử dụng Mockito để xác minh rằng không có gì được gọi sau phương thức
- 8. Hệ thống chứng minh toán học tương tác
- 9. con trỏ bù nhỏ gọn, triển khai hiện có?
- 10. Hệ thống mẫu Javascript nhỏ gọn, nhỏ gọn?
- 11. Có thể xây dựng một vỏ C tương tác không?
- 12. Cách xác định các tác vụ tùy ý trong Khung chơi? (giống như cào ruby)
- 13. Cách nhỏ gọn để tạo Multimaps ổi?
- 14. Không phân loại bằng một công cụ so sánh "transitive" không có tính tương tác?
- 15. Có cách nào để có được một cá thể System.Configuration.Configuration dựa trên xml tùy ý không?
- 16. Mockito có thể xác minh các tham số dựa trên giá trị của chúng tại thời điểm gọi phương thức không?
- 17. Tôi có thể sử dụng xác thực proxy tương tác với git-svn không?
- 18. Mockito xác minh() không thành công với "quá nhiều lệnh gọi thực tế"
- 19. Sử dụng Mockito, làm cách nào để xác minh một phương thức được gọi với một đối số nhất định?
- 20. Có thể có XML tùy ý trong phần cấu hình tùy chỉnh không?
- 21. Xác minh thông số cụ thể bằng Moq
- 22. Có cách nào để xác định xem Java System.in có "tương tác" không?
- 23. Cách xác minh xem một DataGridViewCheckBoxCell có được kiểm tra
- 24. Thư viện chính xác tùy ý JVM
- 25. Tạo hình thu nhỏ cho tệp âm thanh tùy ý
- 26. Vỏ tùy chỉnh (tương tác) với Python
- 27. Bản ghi biến thể Ada có thể tương thích nhị phân với liên minh C++ không?
- 28. Các Elementtree hoặc lxml nhỏ gọn hơn
- 29. Rất nhỏ gọn Bitarray trong Java
- 30. Android - Ý định cho tác vụ thoại tùy chỉnh
Đây chính là làm thế nào tôi đã được thử nghiệm lớp học của tôi cho đến nay, Tôi chỉ tự hỏi liệu Mockito có thể tha cho tôi từ việc viết những triển khai tầm thường cho tất cả các phương pháp. –
Tôi muốn nói rằng bạn đã làm điều hợp lý Michal. Mockito không hỗ trợ loại thử nghiệm này. Lựa chọn duy nhất của bạn là đi xuống con đường 'ArgumentCaptor' như đã đề cập bởi Kevin, nhưng điều này dẫn đến rất nhiều" tiếng ồn "trong các lớp thi của bạn. – Brad
Đồng ý rằng nó hơi ồn ào, nhưng phần lớn nhiễu được bản địa hoá thành khai báo và phương thức Before, và bạn thậm chí có thể thêm Captor vào khai báo mức lớp nếu nó được sử dụng trên nhiều phương thức Test (thậm chí không cần thiết nếu không truy cập vào msg) . Điều tuyệt vời khi sử dụng Mockito là bạn đã có quyền truy cập vào API ghi nhật ký đầy đủ. Để làm như vậy trong ví dụ của bạn, bạn phải mở rộng khả năng của mô hình được cuộn bằng tay của bạn (chụp/truy xuất số lượng thông điệp đã đăng nhập, v.v.) Nhưng đối với nhu cầu đơn giản, cách của bạn có vẻ đơn giản hơn, sạch hơn, * và * có thể tái sử dụng, một số điểm cộng cho cách tiếp cận của bạn. –