Покрытие кода Emma с помощью JUnit и Powermock

Я использую JUnit с насмешкой над Powermockito. Мне нужно работать в среде CLI с maven или ant.

emma version:      ema-2.0.5312
powermock version: powermock-mockito-1.5.1-full
junit version:     junit-4.9

Когда я запускаю junit с помощью следующей команды, все работает:

java org.junit.runner.JUnitCore some.package.ClassTest

Однако, когда я использовал emma для проверки покрытия кода:

java emmarun -cp $CLASSPATH -report txt org.junit.runner.JUnitCore some.package.ClassTest

Я получил следующую ошибку:

1) initializationError(some.pakage.ClassTest)
   java.lang.ClassCastException: org.powermock.modules.junit4.PowerMockRunner cannot be cast to org.junit.runner.Runner

Другие тестовые классы без использования powermock работают нормально. У кого-нибудь есть предложения по этому поводу? заранее спасибо.


person wlhee    schedule 30.07.2013    source источник
comment
возможный дубликат проблемы покрытия PowerMock ECLEmma   -  person Duc Tran    schedule 10.10.2014


Ответы (2)


при использовании powermock нельзя узнать покрытие с помощью Emma

Посмотрите это обсуждение на стороне разработчиков

person ankit    schedule 19.11.2013

Вы можете использовать MockitoJunitRunner и указать правило для использования PowerMock, поскольку Eclemma работает вместе с MockitoJUnitRunner.

Что-то вроде этого:

@RunWith(MockitoJUnitRunner.class) // This supports Eclemma Plugin. Powermock doesn't.
@PrepareForTest({/* StaticClasses for Powermock here */})
public class ClassTest {

// These two statements; the static block and @Rule make sure Powermock works along with Mockito!!
static {
    PowerMockAgent.initializeIfNeeded();
}

@Rule
public PowerMockRule powerMockRule = new PowerMockRule();

@Mock // To mock dependent class
private MockClass mock;

@InjectMocks //To Inject all mocks in this class
private ClassUnderTest classObject;

//Rest of the code here.

}

Необходимые зависимости:

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.6.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</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.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency

Также вам необходимо добавить это в конфигурации в разделе «Покрытие как» -> «Конфигурации покрытия» -> «Аргументы».

Внутри аргументов виртуальной машины добавьте -noverify и сохраните.введите здесь описание изображения

чтобы это работало с Jacoco, используйте следующий оператор в вашем pom.xml.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
    <argLine>${argLine} -noverify -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/1.6.2/powermock-module-javaagent-1.6.2.jar</argLine>
    </configuration>
</plugin>
person Ramachandra A Pai    schedule 04.09.2018