我有一个多模块 Maven 项目。这有一组由 jaxb 使用 xsd 生成的类。下面给出了此类的示例。(没有 getter 和 setter)
@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 构建执行。为了获取代码覆盖率,添加了 jacoco-maven-plugin。运行时它不会生成 jacoco.exec 文件。根据this post执行目标被添加到我的pom文件中。之后我的单元测试失败,给出一个空指针异常。根据堆栈跟踪,它是在执行“xmlElement.name()”时引起的,这意味着 xmlElement 为空。因此,添加此执行目标后,反射无法获得注释。
我如何解决这个问题并使用 jacoco 或任何其他方式获取代码覆盖率报告。
提前致谢。