Bạn đang tiếp cận điều này sai cách. Chỉ cần kiểm tra chức năng của bạn: nếu ném ngoại lệ, kiểm tra sẽ tự động thất bại. Nếu không có ngoại lệ được ném, tất cả các bài kiểm tra của bạn sẽ chuyển sang màu xanh lá cây.
Thỉnh thoảng tôi nhận thấy câu hỏi này thu hút sự quan tâm vì vậy tôi sẽ mở rộng thêm một chút.
Bối cảnh để kiểm tra đơn vị
Khi bạn kiểm tra đơn vị, điều quan trọng là xác định cho chính bạn những gì bạn coi là một đơn vị công việc. Về cơ bản: trích xuất cơ sở mã của bạn có thể bao gồm hoặc không bao gồm nhiều phương thức hoặc lớp đại diện cho một phần chức năng.
Hoặc, như được định nghĩa trong Nghệ thuật kiểm tra đơn vị, Ấn bản thứ 2 của Roy Osherove , trang 11:
Một thử nghiệm đơn vị là một mảnh tự động mã mà gọi các đơn vị của công việc đang được thử nghiệm, và sau đó kiểm tra một số giả định về một kết quả cuối cùng duy nhất của đơn vị đó. Một bài kiểm tra đơn vị hầu như luôn được viết bằng khung kiểm tra đơn vị. Nó có thể được viết dễ dàng và chạy nhanh. Nó đáng tin cậy, có thể đọc và duy trì. Nó phù hợp với kết quả của nó miễn là mã sản xuất không thay đổi.
Điều quan trọng cần nhận ra là một đơn vị công việc thường không chỉ là một phương thức mà ở cấp độ rất cơ bản, đó là một phương thức và sau đó nó được gói gọn bởi một đơn vị công việc khác.
Tốt nhất bạn nên có một phương pháp kiểm tra cho từng đơn vị công việc riêng biệt để bạn luôn có thể xem ngay lập tức mọi thứ đang xảy ra. Trong ví dụ này, có một phương thức cơ bản được gọi là getUserById()
sẽ trả về người dùng và có tổng cộng 3 đơn vị công việc.
Đơn vị công việc đầu tiên nên kiểm tra xem người dùng hợp lệ có được trả lại hay không trong trường hợp đầu vào hợp lệ và không hợp lệ.
Bất kỳ trường hợp ngoại lệ nào đang bị ném bởi nguồn dữ liệu phải được xử lý ở đây: nếu không có người dùng nào xuất hiện, cần có một thử nghiệm chứng minh rằng một ngoại lệ được ném khi không thể tìm thấy người dùng. Một mẫu của điều này có thể là IllegalArgumentException
cái được bắt với @Test(expected = IllegalArgumentException.class)
chú thích.
Khi bạn đã xử lý tất cả các giai đoạn của bạn cho đơn vị công việc cơ bản này, bạn tiến lên một cấp độ. Ở đây bạn làm chính xác như vậy, nhưng bạn chỉ xử lý các ngoại lệ xuất phát từ cấp độ ngay bên dưới mức hiện tại. Điều này giữ cho mã kiểm tra của bạn có cấu trúc tốt và cho phép bạn nhanh chóng chạy qua kiến trúc để tìm nơi xảy ra sự cố, thay vì phải nhảy khắp nơi.
Xử lý đầu vào bị lỗi và hợp lệ của bài kiểm tra
Tại thời điểm này, rõ ràng chúng ta sẽ xử lý những ngoại lệ này như thế nào. Có 2 loại đầu vào: đầu vào hợp lệ và đầu vào bị lỗi (đầu vào hợp lệ theo nghĩa chặt chẽ, nhưng nó không chính xác).
Khi bạn làm việc với đầu vào hợp lệ, bạn sẽ đặt kỳ vọng ngầm định rằng bất kỳ bài kiểm tra nào bạn viết, sẽ hoạt động.
Một cuộc gọi phương thức như vậy có thể trông như thế này : existingUserById_ShouldReturn_UserObject
. Nếu phương pháp này thất bại (ví dụ: một ngoại lệ được ném) thì bạn biết có gì đó không ổn và bạn có thể bắt đầu đào.
Bằng cách thêm một thử nghiệm khác ( nonExistingUserById_ShouldThrow_IllegalArgumentException
) sử dụng đầu vào bị lỗi và mong đợi một ngoại lệ, bạn có thể biết liệu phương thức của mình có thực hiện đúng với đầu vào sai hay không.
TL; DR
Bạn đã cố gắng thực hiện hai điều trong bài kiểm tra của mình: kiểm tra đầu vào hợp lệ và bị lỗi. Bằng cách chia phương pháp này thành hai phương pháp mà mỗi phương pháp thực hiện một việc, bạn sẽ có các bài kiểm tra rõ ràng hơn nhiều và tổng quan tốt hơn nhiều về những điều sai lầm.
Bằng cách ghi nhớ đơn vị phân lớp của các tác phẩm, bạn cũng có thể giảm số lượng bài kiểm tra bạn cần cho một lớp cao hơn trong hệ thống phân cấp vì bạn không phải tính đến mọi điều có thể sai ở các lớp thấp hơn: các lớp bên dưới lớp hiện tại là một đảm bảo ảo rằng các phần phụ thuộc của bạn hoạt động và nếu có lỗi xảy ra, nó nằm trong lớp hiện tại của bạn (giả sử các lớp thấp hơn không tự ném bất kỳ lỗi nào).