Tôi có một triển khai bộ xương, như trong Mục 18 từ Java hiệu quả (thảo luận mở rộng ở đây ). Đây là một lớp trừu tượng cung cấp 2 phương thức công khai phương thứcA () và phương thứcB () gọi các phương thức lớp con để "lấp đầy các khoảng trống" mà tôi không thể định nghĩa theo cách trừu tượng hóa.
Tôi đã phát triển nó đầu tiên bằng cách tạo ra một lớp cụ thể và viết các bài kiểm tra đơn vị cho nó. Khi lớp thứ hai đến, tôi có thể trích xuất hành vi chung, thực hiện "các khoảng trống bị thiếu" trong lớp thứ hai và nó đã sẵn sàng (tất nhiên, các bài kiểm tra đơn vị đã được tạo cho lớp con thứ hai).
Thời gian trôi qua và bây giờ tôi có 4 lớp con, mỗi lớp thực hiện 3 phương thức được bảo vệ ngắn rất cụ thể để thực hiện cụ thể của chúng, trong khi việc thực hiện bộ xương thực hiện tất cả các công việc chung.
Vấn đề của tôi là khi tôi tạo một triển khai mới, tôi viết lại các bài kiểm tra:
- Liệu lớp con gọi một phương thức cần thiết nhất định?
- Liệu một phương thức nhất định có một chú thích nhất định?
- Tôi có nhận được kết quả mong đợi từ phương pháp A không?
- Tôi có nhận được kết quả mong đợi từ phương pháp B không?
Trong khi thấy lợi thế với phương pháp này:
- Nó ghi lại các yêu cầu của lớp con thông qua các bài kiểm tra
- Nó có thể thất bại nhanh trong trường hợp tái cấu trúc có vấn đề
- Kiểm tra toàn bộ lớp con và thông qua API công khai của chúng ("phương thứcA () có hoạt động không?" Và không "phương thức được bảo vệ này có hoạt động không?")
Vấn đề tôi gặp phải là các bài kiểm tra cho một lớp con mới về cơ bản là không có trí tuệ: - Các bài kiểm tra đều giống nhau trong tất cả các lớp con, chúng chỉ thay đổi kiểu trả về của các phương thức (triển khai bộ xương là chung) và các thuộc tính I kiểm tra phần khẳng định của bài kiểm tra - Thông thường các lớp con không có bài kiểm tra dành riêng cho chúng
Tôi thích cách các bài kiểm tra tập trung vào kết quả của lớp con và bảo vệ nó khỏi tái cấu trúc, nhưng thực tế việc thực hiện bài kiểm tra chỉ là "công việc thủ công" khiến tôi nghĩ rằng mình đang làm gì đó sai.
Là vấn đề phổ biến khi kiểm tra phân cấp lớp? Làm thế nào tôi có thể tránh điều đó?
ps: Tôi đã nghĩ về việc thử nghiệm lớp bộ xương, nhưng có vẻ lạ khi tạo ra một bản mô phỏng của một lớp trừu tượng để có thể kiểm tra nó. Và tôi nghĩ rằng bất kỳ tái cấu trúc nào trên lớp trừu tượng thay đổi hành vi mà lớp con không mong đợi sẽ không được chú ý nhanh như vậy. Ruột của tôi nói với tôi rằng kiểm tra lớp con "nói chung" là cách tiếp cận ưa thích ở đây, nhưng xin vui lòng cho tôi biết tôi sai :)
ps2: Tôi đã googled và tìm thấy nhiều câu hỏi về chủ đề này. Một trong số đó là một trong những này trong đó có một câu trả lời rất lớn từ Nigel Thorne, trường hợp của tôi sẽ là "số 1" của mình Điều đó sẽ rất tuyệt, nhưng tôi không thể tái cấu trúc vào thời điểm này, vì vậy tôi sẽ phải sống với vấn đề này. Nếu tôi có thể cấu trúc lại, tôi sẽ có mỗi lớp con làm chiến lược. Điều đó sẽ ổn, nhưng tôi vẫn sẽ kiểm tra "lớp chính" và kiểm tra các chiến lược, nhưng tôi sẽ không nhận thấy bất kỳ sự tái cấu trúc nào phá vỡ sự tích hợp giữa lớp chính và chiến lược.
ps3: Tôi đã tìm thấy một số câu trả lời nói rằng "có thể chấp nhận được" để kiểm tra lớp trừu tượng. Tôi đồng ý rằng điều này có thể chấp nhận được, nhưng tôi muốn biết đó là cách tiếp cận ưa thích trong trường hợp này (tôi vẫn đang bắt đầu với các bài kiểm tra đơn vị)