Nó là một chút hacky, nhưng tôi muốn sử dụng chỉ thị này biên soạn có điều kiện:
{$IfNDef TEST}
private
{$EndIf}
dự án thử nghiệm đơn vị của bạn nên xác định thử nghiệm trong project → conditional defines
.
Không có thông số kỹ thuật hiển thị, chúng sẽ được xuất bản. Cẩn thận: nếu hiển thị riêng tư không phải là người đầu tiên trong khai báo lớp, nó sẽ nhận định nghĩa trước đó.Một cách an toàn hơn, nhưng tiết hơn và ít rõ ràng, sẽ là:
private
{$IfDef TEST}
public
{$EndIf}
này có một số ưu điểm so với các subclassing hoặc cách tiếp cận khác:
- Không thêm phức tạp: không có các lớp học thêm trong mã của bạn
- Không ai có thể "nhầm lẫn" phân lớp và ghi đè lên lớp học của bạn: bạn giữ nguyên kiến trúc của mình
- Khi bạn nói một phương pháp được bảo vệ, bạn có thể mong đợi rằng nó sẽ bị ghi đè. Bạn đang nói điều này cho những người đang đọc mã của bạn. Một phương pháp được bảo vệ không nên bị ghi đè sẽ gây nhầm lẫn cho người đọc mã của bạn, phá vỡ nguyên tắc lập trình đầu tiên của tôi: "mã phải được viết để được đọc bởi những người khác."
- DUnit nằm trong đơn vị riêng của chúng, không được bao gồm ở mọi nơi
- Bạn không chạm vào RTTI lộn xộn.
Tôi nghĩ rằng đó là giải pháp rõ ràng hơn và tốt hơn câu trả lời đã chọn.
Khi tôi sử dụng điều này, tôi cũng định cấu hình dự án thử nghiệm để đặt các đối tượng xây dựng vào một thư mục khác của dự án chính. Điều này ngăn không cho các tệp nhị phân có chỉ thị TEST kết hợp với mã khác.
Xem thêm: [Cách thích hợp để kiểm tra một lớp học với các phương thức riêng bằng cách sử dụng JUnit là gì?] (Http://stackoverflow.com/questions/34571/whats-the-proper-way-to-test-a-class -with-private-methods-using-junit) – mjn
Một tùy chọn khác http://stackoverflow.com/questions/7525071/accesing-a-strict-private-field-using-the-rtti – sav
Bản sao có thể có của [Làm cách nào để kiểm tra một lớp học có các phương thức riêng, các trường hoặc các lớp bên trong?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or- bên trong lớp học) – Raedwald