Maven не может найти тесты JUnit для запуска
У меня есть проект на Maven, который компилируется без проблем. Однако при запуске команды mvn test
она не выполняет никаких тестов (в разделе TESTs выдает сообщение «There are no tests to run.»).
Я воспроизвел эту проблему с очень простым проектом, структуру которого я приведу ниже, а также выведу результаты выполнения с флагом -X
.
Юнит-тесты работают без проблем из Eclipse (как с его стандартным пакетом JUnit, так и с jUnit.jar, загруженным через Maven). Кроме того, команда mvn test-compile
корректно создает класс в директории test-classes. Я работаю на OSX 10.6.7 с Maven 3.0.2 и Java 1.6.0_24.
Вот структура директорий:
/my_program/pom.xml
/my_program/src/main/java/ClassUnderTest.java
/my_program/src/test/java/ClassUnderTestTests.java
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my_group</groupId>
<artifactId>my_program</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>My Program</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
ClassUnderTest.java:
public class ClassUnderTest {
public int functionUnderTest(int n) {
return n;
}
}
ClassUnderTestTests.java:
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ClassUnderTestTests {
private ClassUnderTest o;
@Before
public void setUp() {
o = new ClassUnderTest();
}
@Test
public void testFunctionUnderTest_testCase1() {
Assert.assertEquals(1, o.functionUnderTest(1));
}
@Test
public void testFunctionUnderTest_testCase2() {
Assert.assertEquals(2, o.functionUnderTest(2));
}
}
Результат выполнения команды mvn -X test:
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test ...
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
There are no tests to run.
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Не могу понять, почему Maven не находит и не запускает тесты. Буду благодарен за помощь!
5 ответ(ов)
ОБНОВЛЕНИЕ:
Как отметил @scottyseus в комментариях, начиная с Maven Surefire 2.22.0 достаточно просто добавить следующий код в ваш pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
При использовании JUnit 5 я столкнулся с аналогичной проблемой. Maven Surefire требует плагин для запуска тестов JUnit 5. Добавьте это в ваш pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
</plugin>
Источник: JUnit 5 User Guide
ОБНОВЛЕНИЕ 2021
junit-platform-surefire-provider, который изначально был разработан командой JUnit, был объявлен устаревшим в JUnit Platform 1.3 и прекращен в 1.4. Пожалуйста, используйте нативную поддержку Maven Surefire вместо этого.
Да, вы правы. В Java-проектах, использующих систему сборки, такую как Maven или Gradle, тестовые классы должны располагаться в каталоге src/test/java
. Если вы поместите тесты в основной каталог src/main/java
, система не распознает их как тестовые классы и не сможет выполнить соответствующие тесты.
Пример неправильной структуры:
/my_program/src/main/java/NotTest.java
Правильная структура должна выглядеть так:
/my_program/src/test/java/MyTest.java
Таким образом, убедитесь, что все ваши тестовые файлы находятся в правильной директории, чтобы они могли быть обнаружены и выполнены.
Одной из причин, по которой Maven может не находить тесты, является неправильное указание типа упаковки модуля.
В недавнем случае у пользователя в pom.xml
было указано <packaging>pom</packaging>
, и мои тесты никогда не запускались. Я изменил это на <packaging>jar</packaging>
, и теперь всё работает корректно.
В вашем случае решение было в добавлении зависимости junit-vintage-engine
, которая обеспечивает совместимость с более старыми версиями тестов JUnit и позволяет их запускать. Поскольку вы используете JUnit 5, добавление этого компонента решает проблему.
Вот как выглядит конфигурация зависимости в вашем pom.xml
:
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
Эта зависимость позволит вам запускать старые тесты, написанные для JUnit 4, в среде JUnit 5, что может быть особенно полезно при миграции существующего проекта.
Также проверьте, чтобы директория с вашими тестовыми классами (например, src/test/java) соответствовала директории, указанной в свойстве <testSourceDirectory>
в вашем pom.xml под секцией <build>
. Мне потребовалось некоторое время, чтобы это выяснить.
Как проверить, что в JUnit-тестах выбрасывается определенное исключение?
Как добавить локальные JAR-файлы в Maven-проект?
Как проверить, что конкретный метод не был вызван, используя Mockito?
IntelliJ сообщает "Невозможно разрешить символ", но код все равно компилируется
Необходимый компилятор в данной среде отсутствует. Возможно, вы используете JRE вместо JDK?