2010-01-12 23 views
11

Nhóm phát triển của tôi đã bắt đầu sử dụng Mockito và có các lớp học đã được định nghĩa là 'cuối cùng'. Tôi đã đọc trong Java hiệu quả của Joshua Bloch và trong chủ đề SO When to use final rằng tất cả các lớp nên sử dụng công cụ sửa đổi cuối cùng. Đã có một số bất đồng trong chuỗi, nhưng tôi đồng ý với ý tưởng ép buộc bố cục lớp trừ khi thừa kế có ý nghĩa.Việc cần làm khi thực hành tốt nhất của Java xung đột với Mockito

Tôi nên làm gì khi tôi muốn kiểm tra các lớp bằng cách sử dụng khung kiểm tra như Mockito yêu cầu lớp học không có công cụ sửa đổi 'cuối cùng'? Tôi hy vọng người khác đã gặp phải các vấn đề tương tự trong quá trình phát triển của họ. Nhóm phát triển của bạn đã đạt được giải pháp nào?

Có hai câu trả lời rõ ràng như sử dụng JMock hoặc loại bỏ sửa đổi cuối cùng trên các lớp chúng tôi muốn kiểm tra, nhưng chúng tôi muốn gắn bó với một khung kiểm tra bên ngoài (bên cạnh JUnit) và có thể khó thuyết phục người khác các nhà phát triển để loại bỏ công cụ sửa đổi 'cuối cùng'.

Cảm ơn.

+4

Làm tất cả các lớp * * 'final' chắc chắn không phải là thực hành tốt nhất ... đã lâu rồi kể từ khi đọc Java hiệu quả, nhưng sự đồng thuận của chuỗi được liên kết chắc chắn dường như không ngụ ý rằng. Bạn nên đánh dấu các lớp 'final' để biểu thị có một số lý do chúng không nên được mở rộng - nếu không có lý do gì, nó chỉ thêm vào sự phức tạp không cần thiết - như bạn đã tìm thấy. Ngoài ra, nếu bạn nhận ra bạn cần mở rộng lớp ở đâu đó trên đường, bạn phải thay đổi mã của lớp gốc để viết lớp mới - vi phạm nguyên tắc Mở/Đóng. – Nate

Trả lời

10

Bạn cần gì nhất:

  1. Khả năng để đảm bảo rằng ai đó không kế thừa từ lớp học của bạn, HOẶC
  2. Khả năng để đảm bảo rằng mã của bạn là kiểm chứng bằng khuôn khổ mocking lại lựa chọn?

Nói chung, tôi tin rằng bạn không cần thực thi (1). Đối với tôi, testability (2), là quan trọng hơn nhiều. Điều gì phù hợp với tình huống của bạn tốt nhất?

+0

Testability là IMHO quan trọng hơn rất nhiều và tôi tin rằng nó phù hợp với tình hình của chúng tôi. – austen

+1

Không cần phải hy sinh thiết kế vì lợi ích của "testability". Bạn có thể có cả hai, bằng cách sử dụng đúng công cụ cho công việc.Trong trường hợp này, hãy sử dụng một trong các công cụ mô phỏng Java có thể mô phỏng các phương thức và lớp cuối cùng: JMockit (công cụ của riêng tôi) hoặc PowerMock (hỗ trợ Mockito API, vì vậy bạn không phải viết lại đầy đủ các bài kiểm tra hiện có). –

4

Nếu bạn muốn lớp học của bạn là cuối cùng, bạn có thể yêu cầu họ triển khai giao diện. Các giao diện là mockable.

4

Như đã đề cập trong câu trả lời khác, bạn có thể làm cho các lớp học cuối cùng của bạn để thực hiện giao diện (s) và trong các thử nghiệm của bạn giả lập giao diện (s).

Đây là một trong những lợi ích của việc sử dụng các đối tượng Mock; trong các tình huống như thế này, họ làm cho bạn suy nghĩ về cách mã có thể được tổ chức tốt hơn. Nếu cơ sở mã của bạn có rất nhiều tham chiếu đến các lớp cuối cùng (do đó ràng buộc với việc thực hiện cụ thể) nó vi phạm nguyên tắc OO của "lập trình cho một giao diện" và sự cần thiết của testability tốt hơn sẽ giúp bạn suy nghĩ về tái cấu trúc để loại bỏ sự phụ thuộc vào triển khai cụ thể.

giấy này vào cách sử dụng của Mock Objects Endo-testing: Unit Testing with Mock Objects có một phần (4.4) với tựa đề Interface khám phá giải thích cách giả đối tượng giúp đỡ trong việc khám phá ra các giao diện.

+0

Tôi thích ý tưởng khám phá giao diện. – austen

+3

Khi tôi viết mã sử dụng một lớp cuối cùng và lớp này không thực hiện một giao diện riêng biệt, tôi * không * vi phạm "chương trình cho một giao diện, không phải là một thực hiện" nguyên tắc GoF. Nguyên tắc * không * yêu cầu mỗi lớp thực hiện một giao diện riêng biệt. Các phần khác của cuốn sách GoF làm rõ điều này, cho những người sẵn sàng đọc nó. –

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