2017-03-03 15 views
2

Powermock을 사용하고 있지만 Eclemma 적용 범위를 실행할 때 EclEmma의 알려진 문제로 인해 Powermock 테스트 사례가 최종 점수로 고려되지 않습니다.EclEmma, ​​powermock 및 Java 7 문제

내가 검색 및 유래에 대한 다른 답변이 가지고 제안하는 이것에 대한 주변의 일 :

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

static { 
PowerMockAgent.initializeIfNeeded(); 
} 

그런 다음, powermock 모듈 - junit4 규칙 에이전트 powermock 모듈 - javaagent 같은 항아리를 추가합니다.

은 그때 내 코드를 실행 오류를 발견하고 때이 작업을 수행 한 후이 답을

java.lang.VerifyError: Expecting a stackmap frame at branch target 7 

는 다양한 버전의 javassit을하는 것이 좋습니다. 그러나 나는 그 일을하고 같은 오류를 얻을 수 없습니다. 내가 PowerMock 테스트 케이스가 최종 Eclemma에 포함 할 얻을 수있는 방법

<dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>1.6.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>1.6.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-javaagent</artifactId> 
     <version>1.6.2</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4-rule-agent</artifactId> 
     <version>1.6.2</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.21.0-GA</version> 
     <scope>test</scope> 
    </dependency> 

점수 :

내 pom.xml 파일은 같다?

답변

2

내가 좋아하는 답변 : 시도하는 데 시간을 낭비하지 마십시오.

대신 으로 가져 가면 PowerMock을 사용해서는 안됩니다. PowerMock을 사용하지 않고도 테스트 할 수있는 더 나은 프로덕션 코드를 작성하는 방법을 배우려면 시간과 에너지를 사용하십시오.

예를 들어, videos; static 또는 (새 코드) (테스트 할 수없는 방식)으로 전화하는 것을 피하는 코드는 매우 자주 불량 코드입니다. 이 코드를 개선하면 PowerMock을 제거하는 데 도움이 될뿐 아니라 모든 제품을 개선하는 데 도움이됩니다.

그리고 PowerMock을 열심히 두는 경우가 있습니다. 내 제안 : 두 개의 버킷 (실제로 PowerMock 만 사용할 수있는 PowerMock 용 및 다른 모든 것 용으로 하나)에 테스트를 넣으십시오. 후자에 대한 적용 범위 만 측정합니다. 이것은 또한 "경로 전달"을 열 것입니다 : 당신이 새로운 것을 위해 PowerMock을 사용하는 것을 피하십시오. 대신, 여러분은 mockito를 사용할 수 있습니다. mockito는 지난 여러 해를 향상 시켰습니다. 심지어 최종 방법을 무시하는 것과 같은 (실험적으로) 것들을 허용합니다.

0

나는 길을 찾아 냈지만 깨끗하지는 않을지 모르지만 나는 그것이 효과가 있다고 생각한다.
그래서 문제는 Powermock을 EclEmma에 포함시키는 방법이었습니다.. 접근
첫 번째 변화는 Eclemma의 받는다는 방식으로 이동했다 즉 jacoco
대답로 이동하기 전에 아래의 링크를 통해 이동 주시기 바랍니다 : 간단히 말해서, jacoco 식별에

Power mock with jacoco
Basic of Java Instrumentation

을로드 할 때 바이트 코드 잠금/업데이트/클래스를 계측함으로써 코드 적용 범위.
그리고 그 작업을위한 powermock도 바이트 코드/잠금 장치를 업데이트/클래스을 작동시키기 위해 을 사용합니다. 그러나 디스크에서 가져온 것이고 메모리가 아닙니다..
그래서 jacoco로 커버리지가 주어지면 powermock 클래스는 디스크 파일의 테스트 케이스를 실행하므로 powermock 클래스는 다루지 않으며 jacoco는 powermock이 무엇을하고 있는지 전혀 모른다.
그래서 jacoco로 인스트루먼트 된 클래스를 디스크에 저장 한 다음 powermock은 해당 클래스를 테스트하여 jacoco가 테스트가 실행 중임을 알리고 코드 커버리지에 포함 시키도록합니다.
그래서 최종 코드 변경이
[PLS 본에 대한 나의 이해를 수정 느낄 무료] :

<dependency> 
     <groupId>org.jacoco</groupId> 
     <artifactId>org.jacoco.agent</artifactId> 
     <version>0.7.7.201606060606</version> 
     <classifier>runtime</classifier> 
    </dependency> 
    <dependency> 
     <groupId>org.assertj</groupId> 
     <artifactId>assertj-core</artifactId> 
     <version>3.6.1</version> 
     <scope>test</scope> 
    </dependency> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <configuration> 
       <excludes> 
       // files you want to exclude 
       </excludes> 
      </configuration> 
      <executions> 
       <execution> 
        <id>default-instrument</id> 
        <goals> 
         <goal>instrument</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>default-restore-instrumented-classes</id> 
        <goals> 
         <goal>restore-instrumented-classes</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>report</id> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>report</goal> 
        </goals> 
        <configuration> 
         <dataFile>${project.build.directory}/coverage.exec</dataFile> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <systemPropertyVariables> 
        <jacoco-agent.destfile>${project.build.directory}/coverage.exec</jacoco-agent.destfile> 
       </systemPropertyVariables> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

을 한 후이 -PcodeCoverage이 날 위해 일을 실행.