9

Tôi muốn thực hiện kiểm tra null cho các đối số phương pháp của mình, như thông số không được rỗng. Có sử dụng một cái gì đó như thế này assertNotNull("Map should not be null", filePaths); trong mã Java của tôi không? Tôi đang cố gắng để tránhBạn có thể sử dụng API Junit Assert trong mã sản xuất Java

if(filePaths == null){ 
    throw new IllegalArgumentException("Maps cannot be null"); 
} 

chỉ để giữ mã của tôi sạch từ tất cả những kiểm tra null. Tôi biết tôi có thể viết một lớp học Validator của riêng tôi và đã quá tải phương pháp notNull nhưng có cái gì đó hiện có và đơn giản để sử dụng để không tái phát minh ra bánh xe.

Hạn chế duy nhất tôi thấy khi sử dụng JUnitAssert là nó ném AssertionError và không IllegalArgumentException và v.v.

+3

Tại sao không sử dụng ['Preconditions'] của Guava (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Preconditions.html)? –

+0

Một tùy chọn khác là sử dụng từ khóa khẳng định do ngôn ngữ Java cung cấp - ví dụ: khẳng định null! = Filepaths: "Bản đồ không thể rỗng". Các kiểm tra này có thể được bật hoặc tắt khi khởi động. –

+1

@AndyThomas: _Không sử dụng các xác nhận để kiểm tra đối số trong các phương thức công khai._ từ [Tài liệu] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html). Nếu xác nhận bị vô hiệu hóa, nó sẽ không bao giờ được gọi là –

Trả lời

6

Không, không thể sử dụng nó. Các JUnit khẳng định phương pháp ném một AssertionError. Bạn không nên ném Error vào mã sản xuất. Từ javadoc:

Lỗi là một phân lớp của Throwable cho biết các vấn đề nghiêm trọng mà ứng dụng hợp lý không nên cố bắt. Hầu hết các lỗi là điều kiện bất thường. Lỗi ThreadDeath, mặc dù là điều kiện "bình thường" , cũng là một phân lớp của Lỗi vì hầu hết các ứng dụng không nên cố bắt nó. Một phương thức không được yêu cầu để khai báo trong mệnh đề ném của nó bất kỳ lớp con nào của Lỗi có thể là được ném trong khi thực hiện phương pháp nhưng không bị bắt, vì các lỗi là điều kiện bất thường không bao giờ xảy ra. Tức là, lỗi và các lớp con của nó được coi là ngoại lệ không được kiểm tra cho mục đích của việc kiểm tra các trường hợp ngoại lệ theo thời gian biên dịch.

+0

Ngay cả khi tôi viết xác nhận của riêng mình, tôi vẫn sẽ ném IllegalArgumentException vào mã sản xuất. Oh bạn có nghĩa là ném 'Ngoại lệ' và không phải là 'Lỗi ' –

+0

Đúng, tôi có nghĩa là không ném một lỗi như trái ngược với một ngoại lệ. –

12

Nếu bạn sử dụng Java 7+, bạn có thể sử dụng:

Objects.requireNonNull(filePaths, "Map should not be null"); 

Ngoài ra với một đối số null, tôi mong chờ một NullPointerException hoặc một IllegalArgumentException, nhưng không phải là một AssertionError.

+0

Cảm ơn bạn đã trả lời. Chúng tôi vẫn còn trên Java 6 nhưng tốt để biết rằng nó được xây dựng trong Java 7 –

+0

@Learner Với Java 6, bạn có thể sử dụng điều kiện tiên đoán như đã được chỉ ra (nó gần giống với Objects.requireNonNull). – assylias