Запуск Junit и PowerMock с Mockito через PowerMockRunner от maven

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

Вот тест:

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

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

  • орг.мокито | мокито-все | 1.8.0
  • Юнит | Юнит | 4.6.0
  • org.powermock.modules | powermock-модуль-junit4 | 1.3.1
  • org.powermock.api | powermock-api-mockito | 1.3.1

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

Я делаю что-то неправильно?


Вот мой pom.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=Проверка предупреждений и уведомлений

...
[INFO] Surefire report directory: C:\Devel\Java\EP_PORTAL\information-provider\target\surefi

-------------------------------------------------------
 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 расширенным 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.

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


person Miguel Ping    schedule 25.11.2009    source источник
comment
Запускается ли тест (не расширяющий junit.framework.TestCase), когда вы просто запускаете mvn test?   -  person Pascal Thivent    schedule 26.11.2009
comment
Нет, не запускается.   -  person Miguel Ping    schedule 27.11.2009
comment
Тогда даже не ожидайте, что это будет при использовании -Dtest. У вас другая проблема (и, похоже, вы нашли источник).   -  person Pascal Thivent    schedule 02.12.2009


Ответы (7)


У меня только что была эта ошибка, и я работал над решением. Мой файл pom.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, чтобы понять связанные зависимости.

person Adam Davies    schedule 02.01.2013
comment
Это решение сработало для меня. Я использовал версию Powermock 1.6.4 с Mockito 1.9.5. - person Viv; 28.04.2016

Я не могу воспроизвести вашу проблему. Со следующим содержимым в моем 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?

person Pascal Thivent    schedule 25.11.2009
comment
Пожалуйста, опубликуйте свой pom.xml тогда. Как я уже сказал, я не могу воспроизвести описанное вами поведение. Кстати, что вы наблюдаете, когда запускаете mvn test? - person Pascal Thivent; 25.11.2009
comment
Выложили то, что вы просили - person Miguel Ping; 02.12.2009

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

Когда я запускаю "mvn clean test", этот тест не запускается, он запускается только тогда, когда я указываю тест, используя "-Dtest=..."

В документации surefire упоминается, что по умолчанию ищутся только эти шаблоны: «/Test*.java» — включает все его подкаталоги и все имена файлов java, начинающиеся с «Test». «/Test.java» — включает все его подкаталоги и все имена файлов Java, которые заканчиваются на «Test». «*/*TestCase.java» — включает все его подкаталоги и все имена файлов Java, которые заканчиваются на «TestCase».

Поэтому изменение имени класса на то, которое заканчивается одним из них, будет запускаться при вызове «mvn test», в противном случае плагин surefire должен быть настроен с конкретным именем класса.

person shark8me    schedule 14.09.2012

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

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

Аннотируется ли тест org.junit.@Test ?

person Phantomwhale    schedule 25.11.2009

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

person Nelz    schedule 04.10.2010
comment
Это возможно при использовании двух исполнений. - person Pascal Thivent; 05.10.2010

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

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

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

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

... и соответствующие отделы тестирования ...

    <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>
person Jeff Fairley    schedule 20.03.2014

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

person Miguel Ping    schedule 02.12.2009