Nếu bạn hoàn toàn cần đạt được phạm vi mã 100% - giá trị của điều đó có thể được tranh luận ở nơi khác :) - bạn có thể đạt được nó bằng cách sử dụng sự phản ánh trong các thử nghiệm của bạn. Theo thói quen, khi tôi thực hiện một lớp tiện ích tĩnh chỉ, tôi thêm vào một hàm tạo riêng để đảm bảo rằng các thể hiện của lớp không thể được tạo ra. Ví dụ:
/**
* Constructs a new MyUtilities.
* @throws InstantiationException
*/
private MyUtilities() throws InstantiationException
{
throw new InstantiationException("Instances of this type are forbidden.");
}
Sau đó, kiểm tra của bạn có thể trông giống như thế này:
@Test
public void Test_Constructor_Throws_Exception() throws IllegalAccessException, InstantiationException {
final Class<?> cls = MyUtilties.class;
final Constructor<?> c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
Throwable targetException = null;
try {
c.newInstance((Object[])null);
} catch (InvocationTargetException ite) {
targetException = ite.getTargetException();
}
assertNotNull(targetException);
assertEquals(targetException.getClass(), InstantiationException.class);
}
Về cơ bản, những gì bạn đang làm ở đây là nhận lớp theo tên, tìm kiếm các nhà thầu trên rằng kiểu lớp, thiết lập nó cho công chúng (gọi setAccessible
), gọi hàm khởi tạo mà không có đối số, và sau đó đảm bảo rằng ngoại lệ đích được ném là InstantiationException
.
Dù sao, như bạn đã nói, yêu cầu bao phủ mã 100% ở đây là một nỗi đau, nhưng có vẻ như nó nằm ngoài tầm tay bạn, vì vậy bạn có thể thực hiện rất ít. Tôi đã thực sự sử dụng cách tiếp cận tương tự như ở trên trong mã của riêng tôi, và tôi đã tìm thấy nó có lợi, nhưng không phải từ một quan điểm thử nghiệm. Thay vào đó, nó chỉ giúp tôi tìm hiểu thêm một chút về sự phản chiếu mà tôi biết trước đây :)
Cách tiếp cận thứ ba theo ý kiến của tôi là tốt nhất, vì nó không ảnh hưởng đến mã (chỉ kiểm tra). Tôi sẽ đi theo cách này. Cảm ơn bạn đã giúp đỡ. –