У меня есть проект с несколькими модулями 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 или любых других средств.
Заранее спасибо.