2013-07-15 24 views
8

Khi cố gắng chạy bao phủ bằng hoặc chạy một maven xây dựng sử dụng emma: emma tôi nhận được như sau:Trừ Lớp học tổng hợp trong Emma trong STS

java.lang.IllegalStateException: Không thể truy cập phương pháp: Có thể không được thiết lập . static final lĩnh vực [Z packageName.ClassName $ jacocoData tới [Z

Vì vậy, tôi đã tìm kiếm xung quanh trực tuyến và tôi thấy những điều sau đây trên trang web EclEmma:

Mã của tôi sử dụng sự phản chiếu. Tại sao nó thất bại khi tôi thực hiện nó với JaCoCo?

Để thu thập dữ liệu thực thi, công cụ JaCoCo các lớp được kiểm tra bổ sung hai thành viên vào các lớp: Trường tĩnh riêng $ jacocoData và phương thức tĩnh riêng $ jacocoInit(). Cả hai thành viên được đánh dấu là tổng hợp.

Vui lòng thay đổi mã của bạn để bỏ qua các thành viên tổng hợp. Đây là một thực tế tốt anyways cũng như trình biên dịch Java tạo ra các thành viên tổng hợp trong tình huống nhất định.

Nhưng tôi không thể tìm thấy bất kỳ tài liệu nào trên web về cách thực sự bỏ qua các thành viên tổng hợp với Emma.

Trong STS tôi xem bên dưới Tuỳ chọn/Java/Mã bảo hiểm và tôi thấy hộp Loại trừ để đặt loại trừ (và tôi biết tôi cũng có thể đặt loại trừ trong POM của tôi).

Tôi chỉ tự hỏi cần phải làm gì để loại trừ tất cả các lớp tổng hợp.

Cảm ơn

+0

Cách 'hacky' để bỏ qua '$ jacocoData' là biết thực tế là nó luôn được nối vào cuối danh sách thành viên của lớp. Mặc dù, chúng tôi rất muốn biết cách loại trừ bất kỳ thành viên tổng hợp nào của lớp Java/Scala. –

+0

Bất kỳ may mắn nào với nó? Tôi đã gặp vấn đề tương tự và bây giờ tôi đang tìm cách thay đổi mã của bạn để bỏ qua các thành viên tổng hợp_. – topr

Trả lời

9

Gần đây tôi đã gặp sự cố này với trình trợ giúp xuất CSV chung mà tôi đang sử dụng. Ngoại lệ bạn thấy là Jacoco/Emma không thể thiết lập trường tổng hợp mà nó sử dụng để theo dõi phạm vi mã của bạn. Bạn cần cho phép Emma truy cập trường tổng hợp đó.

Nếu bạn đã dừng Emma truy cập các trường tổng hợp vì việc thêm trường tổng hợp gây ra sự cố với sự phản ánh của bạn, ví dụ: bạn đang sử dụng phản ánh để lặp qua một tập hợp các đối tượng Field, chỉ cần làm như sau:

Field[] fields = fooObject.getClass().getDeclaredFields(); 
Field[] nonSyntheticFields = new Field[fields.length]; 

for(int i = 0; i < fields.length; i++){   
    if(!fields[i].isSynthetic()){ 
     nonSyntheticFields[i] = fields[i]; 
     //Or whatever processing you are doing here with your fields. 
    } 
} 

Trên đây cho phép bạn tách ra khỏi lĩnh vực tổng hợp, trong đó ứng dụng của bạn nên không thực sự biết gì về, từ các trường bạn đã tuyên bố trên lớp học của bạn. Tôi biết nó có vẻ hơi khó hiểu, nhưng đó là giải pháp thanh lịch nhất mà tôi có thể nghĩ ra. Emma cần trường đó để có thể thiết lập mã của bạn, điều tốt nhất bạn có thể làm là đảm bảo mã của bạn không gây rối với biến tổng hợp đó.

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