EclEmma, ​​powermock и проблема с Java 7

Я использую Powermock, но когда я запускаю покрытие Eclemma, тестовые случаи Powermock не учитываются в окончательной оценке из-за известных проблем с EclEmma.

Обходной путь для этого, который я ищу, и другие ответы на stackoverflow предлагают иметь:

@Rule
public PowerMockRule rule = new PowerMockRule();

static {
 PowerMockAgent.initializeIfNeeded();
}

Затем добавьте банки, такие как powermock-module-javaagent, powermock-module-junit4-rule-agent.

После этого, когда я запускаю свой код, затем обнаруживаю ошибку:

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

Для этого в ответах предлагается иметь javassit различных версий. Но я не могу получить эту работу и получаю ту же ошибку.

Мой pom.xml выглядит так:

<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>

Как я могу включить тестовые примеры PowerMock в окончательную оценку Eclemma?


person Always a newComer    schedule 03.03.2017    source источник


Ответы (2)


Мой любимый вариант ответа: не тратьте время на попытки.

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

Например, начните просматривать эти видео; понять, что код, который избегает вызовов static или new (непроверяемым способом), очень часто является плохим кодом; и что улучшение этого кода не только поможет вам избавиться от PowerMock, но и улучшит ваш продукт в целом.

И если вы обнаружите, что оставить PowerMock сложно; мое предложение: затем поместите свои тесты в два сегмента (один для тех, кто действительно использует PowerMock для вещей, которые может сделать только PowerMock, и один для всех остальных); и измерять охват только для более позднего. Это также открыло бы «путь вперед»: просто избегайте использования PowerMock для каких-либо новых вещей. Вместо этого вы можете обратиться к мокито, который значительно улучшился за последние годы; даже позволяя вам такие вещи (экспериментально), как переопределение конечных методов.

person GhostCat    schedule 03.03.2017

Я нашел способ, может быть, не очень чистый, но я думаю, что он работает.
Итак, формулировка проблемы заключалась в том, как включить Powermock в EclEmma?.
Первое изменение в подходе был переход к подходу maven Эклеммы, то есть jacoco
Пожалуйста, не стесняйтесь перейти по ссылке ниже, прежде чем переходить к ответу:

Power mock с jacoco
Основы инструментирования Java

В двух словах, jacoco определяет покрытие кода, имея блокировать/обновлять байт-код/инструментировать класс при загрузке.
И powermock для его работы также блокировать/обновлять байт-код/инструментировать класс для его функционирования, НО ЭТО ДЕЛАЕТСЯ С ДИСКА, А НЕ ПАМЯТИ.
Таким образом, когда покрытие предоставляется ja coco, классы powermock не охватываются, поскольку powermock запускает тестовые примеры из файлов на диске, а jacoco понятия не имеет, что делает powermock. те классы, которые, в свою очередь, дадут jacoco знать, что тест запущен, и включат их в покрытие кода.
[ПОЖАЛУЙСТА, НЕ ИСПРАВЬТЕ МОЕ ПОНИМАНИЕ ОТНОСИТЕЛЬНО ЭТОГО]
Итак, окончательные изменения кода:

    <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.

person Always a newComer    schedule 06.03.2017