2008-09-20 39 views
33

Có một cuộc tranh luận nổi tiếng trong Java (và các cộng đồng khác, tôi chắc chắn) có nên thử nghiệm các phương thức getter/setter tầm thường hay không. Thông thường, điều này là đối với phạm vi mã. Hãy đồng ý rằng đây là một cuộc tranh luận mở, và không cố gắng trả lời nó ở đây.Có khung kiểm thử đơn vị Java tự động kiểm tra getters và setters không?

Đã có một số bài đăng trên blog về cách sử dụng phản chiếu Java để tự động kiểm tra các phương pháp như vậy.

Có khung nào (ví dụ: jUnit) cung cấp tính năng như vậy không? ví dụ. Một chú thích cho biết "thử nghiệm này T sẽ tự động kiểm tra tất cả các getters/setters trên lớp C, bởi vì tôi khẳng định rằng chúng là tiêu chuẩn".

Dường như với tôi rằng nó sẽ thêm giá trị và nếu được cấu hình, 'cuộc tranh luận' sẽ được để lại dưới dạng tùy chọn cho người dùng.

+1

Có. Xem 'nl.jqno.equalsverifier.EqualsVerifier' và https://www.javacodegeeks.com/2014/09/tips-for-unit-testing-javabeans.html – Barett

Trả lời

7

Unitils thực hiện điều này bằng phương pháp tĩnh assertRefEquals.

15

Tôi không biết bất kỳ thư viện hoặc lớp học sẵn có nào thực hiện việc này. Điều này chủ yếu có thể là do tôi không quan tâm vì tôi đang ở bên cạnh phản đối mạnh mẽ các xét nghiệm như vậy. Vì vậy, mặc dù bạn đã yêu cầu có phải là một chút biện minh cho chế độ xem này:

Tôi nghi ngờ rằng việc thu thập thông tin và định vị có lợi cho chất lượng mã của bạn hoặc mức độ phù hợp của bạn: ví dụ: 100% được bảo hiểm) hoặc không được sử dụng ở tất cả (và có thể được loại bỏ). Cuối cùng, bạn sẽ để lại getters và setters bởi vì chúng được sử dụng từ test nhưng không có nơi nào khác trong ứng dụng.

Sẽ dễ dàng để viết thử nghiệm như vậy, ví dụ: với Apache Commons BeanUtils, nhưng tôi nghi ngờ bạn thực sự cần nó nếu bạn có các bài kiểm tra tốt khác.

+1

Chúng tôi một lần đã phải thực hiện các xét nghiệm như vậy vì getter và setter chỉ được sử dụng trong một dự án phụ thuộc và như vậy không được chạm vào trong các bài kiểm tra đơn vị của dự án của riêng họ. –

+1

Nhận xét muộn - xin lỗi: Điều này rất có thể là vì lý do bảo hiểm mã. Bạn có thể cần phải làm điều đó vì những lý do này, nhưng tôi nghi ngờ bạn sẽ nhận được các bài kiểm tra chất lượng từ nó. Tôi có thể dễ dàng viết các bài kiểm tra crappy cung cấp bảo hiểm 100% mà không có bất kỳ lợi ích nào cả. Đó có phải là lý do tại sao bạn "phải"? –

2

Tôi sẽ ưu tiên thiết kế OO trên phạm vi mã và xem liệu tôi có thể di chuyển các trường đó đến lớp cần chúng hay không. Vì vậy, tôi sẽ cố gắng để xem nếu những getters và setters có thể được gỡ bỏ, như đề xuất trước. getters và setters là breaking encapsulation.

7

Trong hầu hết các trường hợp, setter và getter làm nhiều hơn khi chỉ thiết lập và nhận được một trường nội bộ. Một đối tượng phải kiểm tra các quy tắc nội bộ mà nó chỉ giữ các giá trị hợp lệ. Ví dụ:

  • là giá trị rỗng có thể?
  • là các chuỗi rỗng có thể không?
  • hoặc giá trị âm?
  • hoặc giá trị bằng 0?
  • hoặc giá trị từ danh sách hợp lệ?
  • hoặc có giá trị tối đa không?
  • hoặc có độ chính xác tối đa trên các giá trị BigDecimal không?

Kiểm tra đơn vị nên kiểm tra xem hành vi có chính xác không nếu có giá trị không hợp lệ. Điều này không thể được tự động.

Nếu bạn không có logic trên setter và getter sau đó nó phải được sử dụng bất cứ nơi nào trong ứng dụng của bạn. Viết một bài kiểm tra nơi đối tượng của bạn là một tham số cho một bài kiểm tra phức tạp hơn. Bạn có thể kiểm tra nó sau đó với các giá trị khác nhau từ danh sách.

Kiểm tra logic nghiệp vụ của bạn chứ không phải trình khởi động và thiết lập. Kết quả cũng phải là một vùng phủ sóng của getter và setter. Các phương pháp cũng nên có bất kỳ kết quả nào trong logic nghiệp vụ của bạn nếu bạn chỉ có một thư viện công cộng. Nếu getter và setter không có mã vùng phủ sóng thì hãy xóa nó đi.

0

Trả lời nhận xét trước đó tại @me đây vì danh tiếng của tôi:

Vlookward, không viết getters/setters làm cho không có ý nghĩa gì cả. Các tùy chọn duy nhất để thiết lập các trường riêng là có các bộ định vị rõ ràng, để đặt chúng trong hàm tạo của bạn, hoặc để thiết lập gián tiếp thông qua các phương thức khác (trì hoãn hàm setter đến vị trí khác). Tại sao không sử dụng setters?

Vâng, đôi khi, không cần đến trường là riêng tư (Xin lỗi nếu tiếng Anh của tôi không tốt). Thông thường, chúng tôi viết phần mềm của chúng tôi vì nó là một thư viện và chúng tôi đóng gói các lĩnh vực của chúng tôi (các lĩnh vực logic kinh doanh của chúng tôi) với các getters/setters không cần thiết.

Lần khác, các phương pháp đó thực sự cần thiết. Sau đó, có hai khả năng:
1. Có logic nghiệp vụ bên trong chúng. Sau đó, họ sẽ được thử nghiệm, nhưng họ không phải là getters/setters thực sự. Tôi luôn viết logic đó trong các lớp khác. Và các bài kiểm tra kiểm tra các lớp khác, không phải là POJO.
2. Không có. Sau đó, không viết chúng bằng tay, nếu bạn có thể. Ví dụ: triển khai cho giao diện tiếp theo có thể được tạo tự động hoàn toàn (và cũng trong thời gian chạy!):

interface NamedAndObservable { 
    String getName(); 
    void setName(String name); 
    void addPropertyChangeListener(PropertyChangeListener listener); 
    void addPropertyChangeListener(String propertyName, 
           PropertyChangeListener listener); 
} 

Vì vậy, chỉ kiểm tra những gì được viết bằng tay. Không có vấn đề nếu nó là một getter/setter.

5

Tôi đã làm điều gì đó tương tự. Một lớp java đơn giản lấy một đối tượng và kiểm tra tất cả các phương thức getters và setter. http://sourceforge.net/projects/getterandsetter/

Tôi nghĩ bạn nên tránh các phương pháp getter và setter càng nhiều càng tốt, nhưng miễn là chúng xung quanh và phải mất hai dòng để kiểm tra chúng, đó là một điều tốt để làm điều đó.

1

I am trying out openpojo

Tôi đã đá và lốp xe dường như thực hiện công việc.

  1. Nó cho phép bạn kiểm tra tất cả các pojo trong dự án của bạn.
  2. Dường như để kiểm tra các thông lệ tốt nhất trên POJO của

Kiểm tra hướng dẫn này cho một sự khởi đầu nhanh chóng Tutorial

+0

Tôi gặp sự cố với openpojo. Đối với các lớp "mở rộng" một lớp cơ sở, openpojo tìm kiếm các trường "đã khai báo". Ví dụ: lớp cơ sở trừu tượng có 4 trường và lớp dẫn xuất bê tông có 2 trường bổ sung, chỉ có 2 trường được kiểm tra. –

+0

@TitiWangsabinDamhore Tôi không thấy vấn đề, nếu họ là người định cư & getters thì không có tương tác nào khác thì họ sẽ được kiểm tra như là một phần của lớp cha/cơ sở. Tình huống duy nhất tôi có thể tưởng tượng nó quan trọng là nếu trường được bảo vệ, và lớp con đã xác nhận chặt chẽ hơn xảy ra trong setter hơn lớp cha. – ArtB

+0

@ArtB vấn đề xảy ra khi lớp cơ sở là trừu tượng. Ví dụ. AbstractHouse có 2 trường, 2 phương thức setter và 2 phương thức getter. Có lớp phụ. ExpensiveHouse mở rộng AbstractHouse nó có thêm 1 trường, 1 getter và 1 setter. Khi tôi kiểm tra ExpensiveHouse, mở pojo nhìn vào trường khai báo và thực thi 1 phương thức setter và 1 phương thức getter. Cobertura báo cáo rằng AbstractHouse không được thử nghiệm. Anwyay, đây là vấn đề của tôi trong năm 2014, không chắc liệu OpenPojo có còn hoạt động theo cách này hay không. Nếu tôi làm thử nghiệm (new AbstractHouse() {}); các trường được khai báo này là không có gì và không có bộ định cư hoặc getters nào được thực thi. –

11

tôi tạo ra các dự án OpenPojo để giải quyết chính xác vấn đề này.

Dự án cho phép bạn xác nhận:

  • Enforce POJO tiêu chuẩn mã hóa (ví dụ: Tất cả các lĩnh vực tư nhân, hoặc không có biến bản xứ, ... vv)
  • Enforce hành vi POJO (tức là setter không JUST thiết, không chuyển đổi, v.v.)
  • Xác thực nhận dạng Pojo (ví dụ:Sử dụng chú thích dựa bình đẳng & hệ hashcode)

See Tutorial

+1

qualm của tôi là với tên: rằng bạn không thử nghiệm POJOs bạn đang thực sự thử nghiệm Java Beans. [_ "Thuật ngữ" POJO "chủ yếu được sử dụng để biểu thị một đối tượng Java không tuân theo bất kỳ mô hình đối tượng Java chính, các quy ước hoặc khung công tác nào." _] (Http://en.wikipedia.org/wiki/Plain_Old_Java_Object) getter/setter là một quy ước. [_ "Các hạt Java được tuần tự hóa, có một hàm tạo 0-đối số và cho phép truy cập vào các thuộc tính bằng cách sử dụng các phương thức getter và setter." _] (Http://en.wikipedia.org/wiki/Java_Beans). – ArtB

1

I guess this library is the answer to your question

nó kiểm tra tất cả các giá trị ban đầu của đậu, các setters, các getters, hashCode(), equals() and toString(). Tất cả những gì bạn phải làm là xác định một bản đồ mặc định và thuộc tính/giá trị không mặc định.

Nó cũng có thể kiểm tra các đối tượng là đậu với thêm constructor mặc định không.

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