Ответ 1
Это известная проблема: https://github.com/jayway/powermock/issues/422
И это было давно, оно не будет исправлено в ближайшее время.
Я предлагаю вместо этого использовать eCobertura.
Мы используем EasyMock и PowerMock с JUnit. Используемый инструмент покрытия - ECLEmma. С EasyMock он правильно показывает покрытие в зеленом (как описано). Тем не менее, для кода, который был протестирован модулем с PowerMock, покрытие отображается красным цветом (непокрытым). Читали похожие вопросы в Интернете. Однако просто хотелось проверить, есть ли для этого решение.
Спасибо
Venkatesh
Это известная проблема: https://github.com/jayway/powermock/issues/422
И это было давно, оно не будет исправлено в ближайшее время.
Я предлагаю вместо этого использовать eCobertura.
Да, есть решение для этого:
Сначала вам нужно добавить эту зависимость maven:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule-agent</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
Затем вместо использования этой аннотации @RunWith (PowerMockRunner.class) просто добавьте @Rule в класс Test следующим образом:
public class Test {
@Rule
public PowerMockRule rule = new PowerMockRule();
Вы можете найти больше в этом блоге Как заставить тестирование EclEmma работать с PowerMock
В большинстве случаев это работало в моем проекте:
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
Удалить/Комментировать @RunWith(PowerMockRunner.class)
и включить следующие импорт после добавления powermock-module-javaagent-1.6.5.jar
в свой путь к классам:
import org.junit.Rule;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.powermock.modules.agent.PowerMockAgent;
Теперь щелкните правой кнопкой мыши- > Покрытие As- > Конфигурации покрытия и добавьте следующие строки в Аргументы:
-ea -noverify -javaagent:path/to/powermock-module-javaagent-1.6.5.jar
Нажмите "Применить- > Покрытие".
Также обратите внимание, что @Before
не будет работать в этом случае, поэтому вам нужно добавить все материалы в методах, отмеченных @Test
, методом, помеченным @Before
.
У нас есть статические классы для макета. С издевательскими статическими классами плагин eclEmma для покрытия кода не работает в Eclipse. Итак, что мы сделали, поэтому разместил @RunWith (JUnit4.class) (вместо @RunWith (PowerMockRunner.class)) перед классом и разместил следующие строки внутри класса
static {
PowerMockAgent.initializeIfNeeded();
}
@Rule
public PowerMockRule rule = new PowerMockRule();
Скомпилировал класс и запустил тестовый класс. Покрытие кода работает для класса. Это изменение происходит только в среде Eclipse.
После написания тестовых примеров мы вернули код в норму. Разместил @RunWith (PowerMockRunner.class) вместо @RunWith (JUnit4.class) и прокомментировал выше статические коды и строки powermockrule.
Мне удалось создать покрытие PowerMock с Jacoco, используя powermock-module-javaagent
.
Просто убедитесь, что вы поставили powermock агент после jacoco agent:
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>true</useSystemClassLoader>
<argLine>${jacocoArgLine} -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/${powermock.version}/powermock-module-javaagent-${powermock.version}.jar -noverify</argLine>
...
Если вы хотите увидеть пример, взгляните на этот проект: https://github.com/jfcorugedo/sonar-scanner
Здесь вы можете видеть, что sonar учитывает статические методы и new
операторы, смоделированные PowerMock:
Если вы хотите PowerMockRule
new
операторы, убедитесь, что вы используете PowerMockRule
вместо PowerMockRunner
.
Посмотрите на этот тест
Для насмешливых статических классов использование @RunWith(PowerMockRunner.class)
и выполнение "Теста покрытия JUnit" в Eclipse действительно показывает покрытый код как непокрытый, и это явно кажется проблемой.
Чтобы добавить решение выше, в проекте Maven, вы можете попробовать это..
В корне pom.xml
для генерации отчетов добавьте html
в качестве формата в cobertura-maven-plugin
. Ниже так выглядит.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
</plugin>
Затем перейдите к модулю, в котором находится ваш класс, и откройте файл target/site/cobertura/index.html
в веб-браузере Eclipse или в target/site/cobertura/index.html
на ваш выбор. Вы можете найти информацию о покрытии там.