Простой вопрос: что мне нужно сделать, чтобы написать тест, который вызывается в JUnit под управлением Maven? Я ознакомился с документацией, но, похоже, это неправильно. Я явно чего-то не понимаю.
Я определил тест следующим образом:
import org.junit.jupiter.api.Test;
public void class TestSet1 {
@Test
public void addition() {
// ... perform test here
}
}
Я бы запустил mvn clean test
и запустил тесты 0/0. в другом репозитории он работал, поэтому я меняю местами и пробую ошибку, я обнаруживаю, что:
@Test
не нужнаЧто в итоге сработало:
public class TestSet1 {
public void testAddition() {
// ... perform test here
}
}
Это противоречит документации. Вот Руководство пользователя JUnit 5, из которого был взят этот тестовый пример. В чем дело? В документации четко сказано, что первое должно работать, но это совершенно не сработало, и после долгих возни я обнаружил, что правила кажутся другими. Я воспроизвел это независимо в двух разных средах, на своем рабочем компьютере, а также на своем домашнем компьютере.
Или это то, как я настроил maven? Ниже мой файл POM, и если с ним что-то не так, сообщите мне. Ясно, что он загружает JUnit 5.9.2, а документация отмечена для JUnit 5.9.2.
ОБНОВЛЕНИЕ: как было предложено одним ответом, я указал версию для уверенности, но результат тот же.
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.purplehillsbooks</groupId>
<artifactId>purple</artifactId>
<version>3.2</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
</dependency>
</dependencies>
</project>
Вот полный фактический тестовый класс:
package com.purplehillsbooks.testcase;
import org.junit.jupiter.api.Test;
public class Test3 {
public Test3() {
}
public void testAddition() {
System.out.println("Test3.testAddition has run");
}
@Test
public void addition() {
System.out.println("Test3.addition has run");
}
}
Вот результат выполнения этого:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.purplehillsbooks.testcase.Test3
Test3.testAddition has run
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
Изменились ли средства индикации теста? Я в растерянности, и, наверное, не я один.
UPDATE2: я добавил следующее в POM
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
</plugins>
</build>
И теперь я получаю этот вывод:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.purplehillsbooks.testcase.Test3
Test3.addition has run
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 s - in com.purplehillsbooks.testcase.Test3
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
Это правильно, но странно, что это не имеет ничего общего с JUnit, а только с SureFire.
Я только что проверил на одном из моих рабочих проектов. @Test
требуется, и название метода, начинающееся с «тест», не имеет значения. Я думаю, что ваша проблема в другом. Попробуйте очистить проект вручную, а затем полностью перестроить проект. Я думаю, что у вас есть ошибки компиляции, которые вам не хватает.
@markspace у вас есть явная верная конфигурация? Я смог воспроизвести это поведение без надежной конфигурации, mvn 3.8.1
Нет, я просто запускаю свою IDE по умолчанию. Я не уверен, почему Maven или версия будут иметь значение.
Если я запускаю тесты в IDEA, то pom не имеет значения. Если я запускаю через mvn package
, это так.
Насколько я понимаю из вашего примера
import org.junit.jupiter.api.Test;
public class TestSet1 {
@Test
public addition() {
// ... perform test here
}
}
Вы пытаетесь поместить аннотацию Test в конструктор. Скорее всего вы хотели написать метод, который будет тестировать код, но забыли тип возвращаемого значения, в тестах он должен быть void. Вот что у вас должно получиться:
@Test
void addition() {}
Почти уверен, что это опечатка - в рабочей версии такая же ошибка. Вот почему я попросил реальный код: кто знает, как он выглядит на самом деле!
Если это опечатка, то я не очень понимаю, как можно запустить тест без аннотации Test (-_-)
Мне очень жаль. Я сделал это в нескольких проектах в нескольких средах. Я упростил его здесь, скопировав код из документации для примера, потому что, конечно, реальный код имел 5 или 6 классов, задействованных сложным образом. Я не заметил, что в примере из документации отсутствовал возвращаемый тип. Я виновен в том, что привел пример, который на самом деле не был тем, что я собрал, но я совершенно уверен, что название должно быть таким, каким я его обнаружил, и что это репрезентативно. Извиняюсь за опечатку в том, что я написал здесь.
Обновлен с АКТУАЛЬНЫМ кодом
Я считаю, что это происходит потому, что вы используете более старую версию maven-surefire-plugin
.
Добавьте это в свой помпон:
<build>
<!-- To define the plugin version in your parent POM -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<!-- To use the plugin goals in your POM or parent POM -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
</plugins>
</build>
Теперь вы должны увидеть ожидаемое поведение.
Почему по умолчанию такие, я не знаю.
Да, это сделало это. Странно, как это поведение определяется SureFire, а не JUnit. Документация JUnit должна указать вам на документацию SureFire о назначении тестов. Документация JUnit должна относиться исключительно к поведению maven по умолчанию. Еще раз спасибо за совет. Я не знаю, как бы я нашел это иначе. Это делает поведение таким же, как в документации, однако у меня возникает соблазн использовать поведение по умолчанию, потому что чем меньше конкретных настроек у меня есть, тем лучше. Я не религиозен в отношении того или иного подхода, но просто хочу, чтобы он работал в будущем.
Можете ли вы показать свой реальный код?