Подтвердить что ты не робот

Проблема с PowerLock ECLEmma


Мы используем EasyMock и PowerMock с JUnit. Используемый инструмент покрытия - ECLEmma. С EasyMock он правильно показывает покрытие в зеленом (как описано). Тем не менее, для кода, который был протестирован модулем с PowerMock, покрытие отображается красным цветом (непокрытым). Читали похожие вопросы в Интернете. Однако просто хотелось проверить, есть ли для этого решение.

Спасибо
Venkatesh

4b9b3361

Ответ 1

Это известная проблема: https://github.com/jayway/powermock/issues/422

И это было давно, оно не будет исправлено в ближайшее время.

Я предлагаю вместо этого использовать eCobertura.

Ответ 2

Да, есть решение для этого:

Сначала вам нужно добавить эту зависимость 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

Ответ 3

В большинстве случаев это работало в моем проекте:

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

Ответ 4

У нас есть статические классы для макета. С издевательскими статическими классами плагин 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.

Ответ 5

Мне удалось создать покрытие 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:

enter image description here

Если вы хотите PowerMockRule new операторы, убедитесь, что вы используете PowerMockRule вместо PowerMockRunner.

Посмотрите на этот тест

Ответ 6

Для насмешливых статических классов использование @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 на ваш выбор. Вы можете найти информацию о покрытии там.