Nếu tôi đoán được mục đích câu hỏi của bạn, tôi sẽ nói:
- Bạn muốn kiểm tra hợp lý đối với các trình tạo riêng hoạt động thực tế và
- Bạn muốn cỏ ba lá loại trừ các hàm tạo trống cho các lớp sử dụng.
Đối với 1, rõ ràng là bạn muốn tất cả khởi tạo được thực hiện thông qua các phương thức gốc. Trong những trường hợp như vậy, các bài kiểm tra của bạn sẽ có thể kiểm tra các tác dụng phụ của hàm tạo. Điều này sẽ thuộc loại thử nghiệm phương pháp tư nhân thông thường. Làm cho các phương pháp nhỏ hơn để chúng chỉ làm một số việc xác định hạn chế (lý tưởng là chỉ một việc và một việc tốt) và sau đó kiểm tra các phương pháp dựa vào chúng.
Ví dụ: nếu phương thức khởi tạo [private] của tôi thiết lập các trường cá thể của lớp tôi a
thành 5
. Sau đó, tôi có thể (hoặc đúng hơn là phải) kiểm tra nó:
@Test
public void testInit() {
MyClass myObj = MyClass.newInstance(); //Or whatever factory method you put
Assert.assertEquals(5, myObj.getA()); //Or if getA() is private then test some other property/method that relies on a being 5
}
Đối với 2, bạn có thể định cấu hình cỏ ba lá để loại trừ các hàm tạo Util nếu bạn có một mẫu đặt tên cho các lớp Util. Ví dụ: trong dự án của riêng tôi, tôi sử dụng một cái gì đó như thế này (vì chúng tôi tuân theo quy ước rằng tên cho tất cả các lớp Util phải kết thúc bằng Util):
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
Tôi đã cố tình bỏ qua một phần .*
sau)
bởi vì các hàm tạo như vậy không có nghĩa là để ném các ngoại lệ (chúng không có nghĩa là để làm bất cứ điều gì).
Tất nhiên có thể có trường hợp thứ ba mà bạn có thể muốn có một phương thức khởi tạo trống cho một lớp không phải tiện ích. Trong những trường hợp như vậy, tôi khuyên bạn nên đặt một methodContext
với chữ ký chính xác của hàm tạo.
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
<methodContext name="myExceptionalClassCtor" regexp="^private MyExceptionalClass()$"/>
</clover-setup>
Nếu bạn có nhiều lớp đặc biệt như vậy thì bạn có thể chọn sửa đổi phương thức khởi tạo riêng tổng quát reg-ex mà tôi đã đề xuất và xóa Util
khỏi nó. Trong trường hợp này, bạn sẽ phải tự đảm bảo rằng các tác dụng phụ của phương thức khởi tạo vẫn được kiểm tra và bao phủ bởi các phương thức khác trong lớp / dự án của bạn.
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>