2012-04-13 27 views
8

Có nên thay đổi các phương pháp riêng để bảo vệ cho thử nghiệm JUNIT không?Thay đổi phương pháp riêng để bảo vệ để thử nghiệm

+0

Tại sao phải không? Bạn thay đổi một cái gì đó trước khi bạn kiểm tra, tôi không thể thấy bất kỳ lý do cho nó? – Nanne

+2

Hầu như chắc chắn không phải là một ý tưởng hay; nếu bạn đang trực tiếp kiểm tra các phương thức bên trong của một lớp, bạn nên xem xét tái cấu trúc chúng thành một lớp riêng biệt. –

+0

Tôi đã thực hiện điều này trong trường hợp một phương thức riêng trả về một số tài nguyên không có sẵn trong môi trường thử nghiệm đơn vị và tôi muốn thử nghiệm một số phương thức khác (không riêng tư) gọi nó. Bằng cách làm cho nó được bảo vệ, tôi có thể ghi đè lên nó, để nó trả về một số stub/mock thay vì tài nguyên không có sẵn. Điều này có nghĩa là một bài kiểm tra đơn vị sau đó trở thành khả thi và tôi đã không thể tìm thấy một cách khác vòng này, nhưng nó ít hơn lý tưởng. –

Trả lời

9

Đôi khi hữu ích, vâng.

Nếu lớp học có thể mở rộng, hãy đảm bảo đặt phương thức cuối cùng.

Ngoài ra, hãy ghi lại thực tế rằng phương pháp không được gọi là lớp con hoặc lớp bên ngoài của cùng một gói.

Tôi sử dụng chú thích Guava @VisibleForTesting để làm rõ rằng phương pháp trên thực tế phải là riêng tư.

+0

Cảm ơn bạn đã mở mắt cho @VisibleForTesting. Tôi không biết điều này tồn tại. Nó vẫn còn cảm thấy đây là một chút không hoàn hảo ở chỗ nó tác động đến cú pháp của việc thực hiện chỉ nhằm mục đích thử nghiệm, nhưng nó tốt hơn là phơi bày các thành viên và các phương thức cần được riêng tư. Và việc hạn chế thử nghiệm đối với các phương thức giao diện dường như là một hạn chế quá nghiêm ngặt và đôi khi không thực tế. – Lolo

4

Bạn có thể đặt gói phương thức cục bộ thay thế.

Bạn có thể gọi phương thức riêng tư bằng cách sử dụng phản chiếu hoặc bạn có thể quyết định rằng phương pháp private không được kiểm tra trực tiếp, chỉ gián tiếp.

5

Không nói chung là không. Ý tưởng thử nghiệm đơn vị là để kiểm tra ... đơn vị. Hay nói cách khác là triển khai các phương thức giao diện. Nếu bạn muốn thử nghiệm một phương pháp mà bạn không thể "nhìn thấy" thì đây có thể là một mùi mã. Có lẽ bạn đã không tách logic kinh doanh của bạn đủ từ mã giao diện người dùng hoặc một cái gì đó.

Vì vậy, ý tưởng tốt nhất là suy nghĩ lại kiến ​​trúc của bạn. Nhưng nếu phương án thay thế sẽ không kiểm tra mã của bạn thì tốt hơn hết là nên bảo vệ các phương thức đó.

1

Mặc dù bạn muốn đặt lại cấu trúc như @ user714965 được đề xuất, PowerMock's MockPrivate có thể thực hiện chế độ nhạo báng mà không cần mở khả năng hiển thị của các phương thức riêng tư của bạn.

Viết thử nghiệm của bạn trước tiên thường dẫn đến thiết kế mà bạn không cần phải thử phương pháp riêng tư.

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