Ở những bài trước chúng ta đã tìm hiểu cách test method bằng việc so sánh các giá trị trả về của test case. Vậy với những trường hợp method không trả về giá trị hoặc xảy ra exception thì chúng ta thực hiện unit test như nào?
Sử dụng expect exception
Với những test case cho unit (method, đoạn code) ứng với trường hợp xảy ra exception thì chúng ta expect kết quả là test case đó sẽ trả về / xảy ra exception chứ không phải một giá trị cụ thể.
Ví dụ mình có method thực hiện chia 2 số nguyên:
public class MathUtils {
public static int divide(int input1, int input2 ) throws Exception {
if (input2 == 0) {
throw new ArithmeticException("divide by zero");
}
return input1/input2;
}
}
Với trường hợp input2 = 0 thì xảy ra exception chứ không trả về kết quả nào cả. Do đó ta expect exception như sau:
Nếu method MathUtils.divide(1, 0); không xảy ra exception ArithmeticException thì tức là test case fail
Sử dụng try/catch
Việc sử dụng thuộc tính expected trong annotation @Test có nhược điểm là ta không thể kiểm tra được message của exception hay trạng thái của object sau khi exception được ném ra.
Ta có thể kiểm tra được là exception gì là kiểm tra message có đúng như mong đợi không.
Lệnh fail("Not throw exception"); nếu được chạy tới thì tức là test case bị failed. Như ở test case trên nếu method MathUtils.divide(1, 0); không xảy ra exception thì nó sẽ chạy tới lệnh fail("Not throw exception");
Với trường hợp expect không xảy ra exception thì ta có thể sử dụng fail() trong try/catch. Nếu không xảy ra exception thì lệnh fail()không được chạy qua tức là test case pass.