Работает с JUnit & PowerMock с Mockito через PowerMockRunner с помощью Maven

Я не могу запустить Powermock через maven. Я PowerMock Mockito и PowerMockRunner для вождения теста jUnit.

вот тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { UserLocalServiceUtil.class, ExpandoBridge.class })
public class AlertNotificationsTest {
//...

Я не настроил ничего особенного для запуска теста. Мой pom ссылается на следующие deps:

  • org.mockito | mockito-все | 1.8.0
  • junit | junit / 4.6.0
  • org.powermock.модули / powermock-module-junit4 | 1.3.1
  • org.powermock.api / powermock-api-mockito / 1.3.1

когда я запускаю mvn -Dtest=AlertNotificationsTest test mvn говорит, что нет теста для запуска. Но если я запускаю тот же тестовый класс из eclipse, все работает нормально.

Я делаю что-то не так?


вот мой помпон.xml ниже (соответствующие части)

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>5.9</version>
        <classifier>jdk15</classifier>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.8.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock.modules</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.3.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock.api</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.3.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

вот выход из maven

mvn-Dtest=AlertNotificationsTest тест

...
[INFO] Surefire report directory: C:DevelJavaEP_PORTALinformation-providertargetsurefi

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] No tests were executed!  (Set -DfailIfNoTests=false to ignore this error.)
[INFO] ------------------------------------------------------------------------

Примечание: я могу запускать другие тесты, я просто не могу выполнить этот тест. Если я сделаю AlertNotificationsTest класс extend junit.framework.TestCase класс подбирается maven, но кажется, что он не управляется PowerMockRunner.

вот результат этого:


Running TestSuite
[ERROR]: No test suite found.  Nothing to run
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 1.053 sec <<< FAILURE!

Results :

Failed tests:
  testSingleEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)
  testTwoEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0

опять же, эти тесты отлично работают с Eclipse.


обновление я нашел возможную проблему и решение. У меня есть тесты с TestNG и JUnit. Если я удалю TestNG из своего pom и перенесу все свои тесты в JUnit, я смогу запустить тест PowerMock с помощью mvn test. Таким образом, кажется, что есть проблема с Maven и комбо junit/testng.

Я хотел бы иметь возможность запускать оба, но если я не найду способ, я пойду и отвечу на свой вопрос. Спасибо, ребята&девчата

7 ответов


у меня просто была эта ошибка и я работал через решение. Мой помпон.xml-файл имел следующую зависимость:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.5</version>
  <classifier>full</classifier>
  <scope>test</scope>
</dependency>

проблема возникает из - за того, что мой код использует JUnit, и вышеуказанная зависимость имеет внешнюю зависимость от TestNG. Это останавливало мой тест. Почему я не знаю - вы бы, хотя тестовая структура была бы протестирована немного лучше!!!

В любом случае решение состояло в том, чтобы разбить "полные" зависимости только на те требуется:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito</artifactId>
  <version>1.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-core</artifactId>
  <version>1.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>1.5</version>
  <scope>test</scope>
</dependency>

это решено. Кстати, я использовал mvn dependency:tree чтобы понять связанные зависимости.


Я не могу воспроизвести вашу проблему. Со следующим содержанием в моем pom.XML-код:

  <repositories>
    <repository>
      <id>powermock-repo</id>
      <url>http://powermock.googlecode.com/svn/repo/</url>
    </repository>
  </repositories>
  <properties>
    <powermock.version>1.3.1</powermock.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.powermock.modules</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock.api</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.6</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.8.0</version>
    </dependency>
  </dependencies>

и следующий тестовый класс (пропуск импорта):

@RunWith(PowerMockRunner.class)
@PrepareForTest( { App.class })
public class AppTest {
    @Test
    public void testApp() {
        assertTrue(true);
    }
}

под управлением mvn test -Dtest=AppTest просто отлично работает и дает мне следующий результат:

...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.135 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Wed Nov 25 17:34:32 CET 2009
[INFO] Final Memory: 9M/79M
[INFO] ------------------------------------------------------------------------

Итак, вопрос: у вас есть метод, аннотированный @Test на AlertNotificationsTest?


Я тоже столкнулся с этой проблемой, но это не проблема PowerMock. Мой тестовый класс назывался XStaticTests.Ява.

когда я запускаю "mvn clean test", этот тест не будет запускаться, он запускается только тогда, когда я указал тест с помощью " - Dtest=..."

в документации surefire упоминается, что по умолчанию выполняется поиск только этих шаблонов : "/проверки*.java "- включает все свои подкаталоги и все имена файлов java, которые начинаются с "Test". "/


настройка Powermock выглядит нормально для меня, и банки кажутся прекрасными (предполагая, что транзитивные зависимости maven получают другие банки powermock - у нас есть около 6-7 после того, как наше решение плюща получает их)

Eclipse может использовать свою собственную" внутреннюю " библиотеку JUnit, таким образом, различные модели поведения ?

тест аннотируется с помощью org.тесты JUnit.@ Test ?


Если вы посмотрите на источник плагина Surefire, он делает некоторые подлые вещи. Если он найдет какие-либо пакеты TestNG в загрузчике классов, он предпочтет запустить TestNG TestRunner. Я еще не видел примеров того, как тесты JUNit и TestNG работают бок о бок.


у меня была такая же проблема, и мне потребовалось некоторое время, чтобы выяснить. Моя установка потянула старую версию jboss.javassist, который странно мешал PowerMockRunner работать вообще.

стоит отметить, что у меня также есть смешанная среда JUnit / TestNG. Ранее я пробовал решение добавления нескольких поставщиков surefire, и это тоже не сработало (используя surefire 2.14.1). После обновления до surefire 2.17 начались тесты JUnit и TestNG без необходимости объявлять каких-либо надежных поставщиков.

вот мой раздел плагинов...

        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <groups>spring, unit, integration</groups>
                <systemPropertyVariables>
                    <java.awt.headless>true</java.awt.headless>
                    <org.apache.activemq.default.directory.prefix>target/test/</org.apache.activemq.default.directory.prefix>
                    <log4j.configuration>file:${project.basedir}/src/test/resources/log4j.properties</log4j.configuration>
                </systemPropertyVariables>
                <argLine>${surefire.args}</argLine>
            </configuration>
        </plugin>

... и соответствующее тестирование deps ...

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
        <scope>test</scope>
    </dependency>
    <!--
    PowerMock versions are compatible with specific Mockito versions.
    https://code.google.com/p/powermock/wiki/MockitoUsage13
     -->
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.5.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.5.4</version>
        <scope>test</scope>
    </dependency>
    <!-- without this PowerMock tests don't run in maven -->
    <dependency>
        <groupId>jboss</groupId>
        <artifactId>javassist</artifactId>
        <version>3.8.0.GA</version>
        <scope>test</scope>
    </dependency>

возникла проблема при смешивании тестов TestNG и JUnit. Миграция всех тестов в Junit решила мою проблему. Спасибо, ребята.