0

다중 프로젝트 메이븐 프로젝트가 있습니다. xsd를 사용하여 jaxb에 의해 생성 된 클래스 집합입니다. 이러한 클래스의 예가 아래에 나와 있습니다. (getter 및 setter 제외)execuete jacoco가 에이전트를 준비 할 때 리플렉션을 사용한 Java 주석 캡쳐가 작동하지 않습니다.

@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)); 
     } 
    } 

이 변환을 사용하는 몇 가지 테스트 사례가 있습니다. 그들은 잘 작동하고 메이븐 빌드와 함께 실행됩니다. 코드 커버리지를 취하기 위해 jacoco-maven-plugin이 추가되었습니다. 실행 중에는 jacoco.exec 파일이 생성되지 않습니다. 이에 따르면 post 실행 목표가 pom 파일에 추가됩니다. 그 후 내 유닛 테스트가 실패하여 널 포인터 예외가 발생합니다. 스택 추적에 따르면 "xmlElement.name()"을 실행할 때 발생합니다. 이는 xmlElement가 null임을 의미합니다. 따라서 리플렉션은이 실행 목표를 추가 한 후에 주석을 얻을 수 없습니다.

어떻게이 문제를 해결하고 jacoco 또는 다른 방법을 사용하여 코드 커버리지 보고서를 얻을 수 있습니까?

미리 감사드립니다.

답변

0

나는 해결책을 직접 찾아 낸다. jacoco가 에이전트를 준비 할 때 클래스에 합성 필드가 포함됩니다. 그래서 그것을 얻으려고하면 원하는 주석이없는 합성 필드가 필드 목록에 포함됩니다.

리플렉션 내에서 가장 좋은 방법은 액세스하는 각 필드에 대해 isSynthetic()을 검사하는 것입니다. 이렇게하면 jacoco와 같은 도구뿐만 아니라 컴파일러가 추가 한 필드에 액세스하는 것을 피할 수 있습니다. 자세한 내용은이 링크를 참조하십시오.

synthetic field Jacoco synthetic field