Вопрос

По какой-то причине я не могу получить плагин Maven 2 Surefire для выполнения тестового класса JUnit 4.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

Однако, если я изменю этот класс на JUnit-3, например

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

затем это выполняется.Вот что я сделал:

  • проверенная версия Maven:Apache Maven 2.2.1 (r801777;2009-08-06 20:16:01+0100)
  • проверенная Верная версия:последовал это совет
  • проверенная Верная версия:проверил Надежные банки в моем ~/.m2/repository/org/apache/maven/surefire -- все они либо версии 2.4.2, либо 2.4.3
  • сделал а mvn dependency:tree | grep junit чтобы убедиться, что я завишу только от junit версии 4.7

Модуль, в котором у меня возникла эта проблема, не имеет тестов JUnit 3.

Есть ли что-то еще, чего мне не хватает?

Это было полезно?

Решение

mvn -X помогло мне выявить следующее:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

Таким образом, похоже, что проблема исходила из testng jar, требующий JUnit v3.8.1.Даже несмотря на то , что Test Classpath был настроен на зависимость от JUnit 4, было слишком поздно.

testng зависимость была расположена в моем ПОМ:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

Сразу же после того, как я это прокомментировал, тесты начали выполняться.

Извлеченные уроки:

  • mvn dependency:tree не всегда этого достаточно, mvn -X это друг.
  • surefire создан не для разработчиков heaven (я понял это, просматривая отчеты project JIRA).Это особенно верно, поскольку других альтернатив, если вы используете Maven, нет.

Спасибо всем за вашу помощь.К сожалению, нет способа разделить баллы за ответы между Pascal и Kaleb, но совет Калеба использовать mvn -X помог мне встать на правильный путь, так что баллы за правильные ответы достаются ему.

Другие советы

Плагин Surefire определяет, какой поставщик JUnit следует использовать, на основе пути к классу.Если в пути к классу имеется несколько версий JUnit, вы можете либо исправить путь к классу, чтобы в пути к классу была только одна версия JUnit (как обсуждалось выше), либо вы можете явно указать, какого поставщика вы хотите использовать.Например, указание следующего в вашем (родительском) POM приводит к использованию новейшего поставщика (например, "surefire-junit47").:

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Однако обратите внимание, что Surefire 2.7 изменил способ определения того, какие классы модульного тестирования выполняются. Новое поведение при использовании Surefire 2.7 (или более поздней версии) с JUnit 4 заключается в том, что любой тест без аннотации @Test будет автоматически пропущен. Это может быть здорово, если у вас есть только модульные тесты JUnit 4, но если у вас есть комбинация модульных тестов JUnit 3 и 4, использование поставщика "surefire-junit47" не будет работать корректно.В таких случаях лучше всего явно выбрать поставщика "surefire-junit4":

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Я не знаю, что вы подразумеваете под "не удается выполнить", но помогает ли это явно установить включаемые, используемые maven-surefire-plugin?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

Кроме того, выполняет ли запуск maven с -X флаг предоставляет какую-либо полезную информацию?

Еще одной возможной причиной может быть эта ошибка (закрыта с надписью "Не исправит").: https://issues.apache.org/jira/browse/SUREFIRE-587

Краткое резюме:Тесты, расширяющие TestCase (но не использующие аннотации), не будут приняты, если их название не заканчивается на "Test".

Для какой-нибудь бедняжки, которая задается вопросом, почему Maven не принимает тесты JUnit.

У меня есть и JUnit, и TestNG в качестве зависимостей.Но я хочу, чтобы failsafe запускал мои функциональные тесты с помощью TestNG, а surefire - мои модульные тесты с использованием JUnit.

Однако я обнаружил, что surefire пытался запустить мои модульные тесты с помощью TestNG и ничего не нашел для запуска.Мои тесты JUnit были пропущены.

Позже я наткнулся на это Проблема с Maven и настроил surefire на запуск только таких тестов "JUnit", как этот:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <properties>
      <property>
        <name>junit</name>
        <value>true</value>
      </property>
    </properties>
  </configuration>
</plugin>

Надеюсь, это кому-то поможет.

В интересах пользователей Google, когда у меня возникла эта проблема, это было из-за того, что я включил зависимость PowerMock, которая запускалась в TestNG, в результате чего тесты [TestNG] не были обнаружены SureFire.

Я использовал вкладку m2eclipse "Иерархия зависимостей" редактора POM, чтобы найти зависимость, и щелкнул правой кнопкой мыши, чтобы сгенерировать исключение (см. XML ниже).

Для полноты картины (и для тех, кто не использует m2eclipse) вот XML, который исключает зависимость - я столкнулся с этой функцией Maven, только увидев, что эти теги генерируются автоматически:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.4.9</version>
  <classifier>full</classifier>
  <exclusions>
    <exclusion>
      <artifactId>powermock-module-testng</artifactId>
      <groupId>org.powermock</groupId>
    </exclusion>
  </exclusions>
</dependency>

(В моем случае было достаточно исключить "powermock-module-testng", но вы могли бы исключить TestNG напрямую, если он поступает откуда-то еще.)

Проверка, которую вы выполнили, хороша, особенно проверка того, что вы используете версию 2.3+ плагина surefire (по умолчанию вы получите версию 2.4.3 с maven 2.1 супер ПОМПОН так что все должно быть в порядке) и проверяя, что вы не тянете junit-3.8.1.jar зависимость транзитивно.

Теперь, просто чтобы убедиться, что это не "глобальная проблема" (я так не думаю, TBH), не могли бы вы создать проект с нуля, например, запустив:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

Затем обновите зависимость junit:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <scope>test</scope>
</dependency>

И настройте уровень компилятора для 1.5+

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

Наконец-то поставьте свой SimpleTest.java рядом с AppTest.java и бежать mvn test.

Если запущено mvn test отлично работает для этого проекта (и я ожидаю, что он будет запущен без проблем), не могли бы вы, пожалуйста, обновить свой вопрос с использованием конфигурации POM, которую вы используете (из проекта, у которого возникли проблемы)?

Забавно, что мне помогло одно небольшое изменение!!!

Я изменил название класса с MyClassTest на TestMyClass, У меня появилась эта идея после проверки моего родителя POM.xml содержит строку ниже

<test.include.pattern> **/Test*.java <test.include.pattern/>

1.) Включите следующий плагин surefire в pom.xml

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
</configuration>
</plugin>

2.)По умолчанию плагин surefire выбирает тестовый класс из пакета :- src/test/java/....

Итак, перейдите к пути сборки и включите тестовую папку в classpath, как показано ниже :

enter image description here enter image description here

3.) Перейдите в --> Выполнить как --> Maven Test

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - 
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS

Возникла аналогичная проблема при попытке запустить интеграционные тесты.У меня была старая версия плагина surefire, который пытался запустить TestNG, а не JUnit.Я изменил номер версии в pom на 2.20, и это сработало.

Настроили ли вы свой maven-compile-plugin на правильный уровень компиляции, например:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

В противном случае у maven возникнут проблемы с аннотациями

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top