0

У меня есть проект с несколькими модулями maven. У этого есть набор классов, сгенерированных jaxb, используя xsd. Пример такого класса приведен ниже. (Без геттеров и сеттеров)Запись аннотации Java с отражением не будет работать, когда execuete jacoco готовят агент

@XmlRootElement(name = "IPPAMUser") 
public class IPPAMUser { 

@XmlElement(name = "UserName", required = true) 
protected String userName; 
@XmlElement(name = "PAMInstanceID", required = true) 
protected String pamInstanceID; 
@XmlElement(name = "Product", required = true) 
protected String product; 
@XmlElement(name = "Password", required = true) 
protected String password; 
@XmlElement(name = "PasswordAlogo", required = true) 
protected String passwordAlogo; 
@XmlElement(name = "LastUpdatedOn", required = true) 
protected String lastUpdatedOn; 
@XmlElement(name = "IsGenerated") 
protected boolean isGenerated; 
@XmlElement(name = "LastNotifiedOn", required = true) 
protected String lastNotifiedOn; 
} 

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

Field[] fields = t.getClass().getDeclaredFields(); 
    for(Field field : fields) { 
     Annotation anotation = field.getAnnotation(XmlElement.class); 
     XmlElement xmlElement = (XmlElement) anotation; 

     String methodName; 
     String parameterValue = ""; 
     if(field.getType() == boolean.class){ 
      methodName = "is" + xmlElement.name(); 
     } else { 
      methodName = "get" + xmlElement.name(); 
     } 
     try { 
      Method method = t.getClass().getDeclaredMethod(methodName); 
      if(method.invoke(t) == null){ 
       continue; 
      } 
      parameterValue = method.invoke(t).toString(); 
     } catch (NoSuchMethodException e) { 
      log.error("Method not found. Method : " + methodName, e); 
      log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e)); 
     } catch (InvocationTargetException e) { 
      log.error("Method invoking failed. Method : " + methodName, e); 
      log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e)); 
     } catch (IllegalAccessException e) { 
      log.error("Illegal access " + e); 
      log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e)); 
     } 
    } 

Есть несколько тестовых примеров, которые используют это преобразование. Они отлично работают и исполняются с помощью maven build. Чтобы получить покрытие кода, добавлен jacoco-maven-plugin. При запуске он не создает файл jacoco.exec. В соответствии с этим post цели исполнения добавляются в мой файл pom. После этого мои юниты тестируются с ошибкой, давая исключение нулевого указателя. Согласно трассировке стека это вызвано при выполнении «xmlElement.name()», что означает, что xmlElement имеет значение NULL. Таким образом, размышление не может получить аннотацию после добавления цели выполнения.

Как решить эту проблему и получить отчет о покрытии кода с помощью jacoco или любых других средств.

Заранее спасибо.

ответ

0

Я самостоятельно определяю решение. Когда jacoco готовят агент, он включает некоторые синтетические поля в классы. Поэтому, когда он пытается получить это, что синтетическое поле, которое не имеет желаемой аннотации, включено в список полей.

Как лучшая практика в пределах проверки на отражение isSynthetic() для каждого поля, к которому вы обращаетесь. Это позволит избежать доступа к полям, добавленным компилятором, а также к инструментам вроде jacoco. Для получения дополнительной информации обратитесь к этой ссылке.

synthetic field Jacoco synthetic field

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

  • Нет связанных вопросов^_^