2013-07-15 3 views
8

При попытке запуска охвата, или запустить Maven сборки с помощью Эмме: Эмме я получаю следующее:За исключением синтетических классов в Эмме в STS

java.lang.IllegalStateException: Не удалось получить доступ к методу: Не могу установить . статический финал [Z поле packageName.ClassName $ jacocoData в [Z

Я искал вокруг онлайн, и я нашел следующее на сайте EclEmma:

Мой код использует отражение. Почему это происходит, когда я выполняю его с помощью JaCoCo?

Для сбора данных выполнения JaCoCo аппаратур классов испытываемого , который добавляет два члена класса: частное статическое поле $ jacocoData и частный статический метод $ jacocoInit(). Оба элемента обозначены как синтетические.

Пожалуйста, измените свой код, чтобы игнорировать синтетические элементы. Это хорошая практика в любом случае, так как Java-компилятор создает синтетические элементы в определенной ситуации.

Но я не могу найти документацию в Интернете о том, как фактически игнорировать синтетические элементы с Emma.

В STS я смотрю под Preferences/Java/Code Coverage, и я вижу поле Excludes для исключения исключений (и я знаю, что я мог бы также исключить из моего POM).

Мне просто интересно, что нужно для этого, чтобы исключить все синтетические классы.

Благодаря

+0

«Хакерный» способ игнорировать '$ jacocoData' состоит в том, чтобы знать, что он всегда добавляется в конце списка членов класса. Хотя, мне было бы очень интересно узнать, как исключить любой синтетический член класса Java/Scala. –

+0

Любая удача в этом? Я столкнулся с той же проблемой, и теперь я ищу, как изменить ваш код, чтобы игнорировать синтетические члены. – topr

ответ

9

Недавно я столкнулся с этой проблемой с общим экспортом помощником CSV, который я использовал. Исключением, которое вы видите, является то, что Jacoco/Emma не может установить синтетическое поле, которое оно использует для отслеживания покрытия кода. Вы должны разрешить Emma получить доступ к этому синтетическому полю.

Если вы остановили доступ к синтетическим полям Эммы, так как добавление синтетического поля вызывало проблемы с вашим отражением, например. вы используете отражения для итерации по коллекции Field объектов, просто сделайте следующее:

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. 
    } 
} 

выше позволяет выделить синтетические поля, которые ваше приложение не знают ничего о, от полей, вы заявили на своих занятиях. Я знаю, что это кажется немного взломанным, но это самое элегантное решение, которое я мог бы придумать. Эмма нуждается в этом поле, чтобы иметь возможность управлять вашим кодом, самое лучшее, что вы можете сделать, это убедиться, что ваш код не вписывается в эту синтетическую переменную.

Смежные вопросы