Я запускаю mvn clean package
, и все остальные тесты выполняются, кроме набора тестов. Я запускаю тесты Junit 4 и 5 - выполняются тесты @Rules и тесты @RegisterExtension/@ExtendWith. Не знаю, почему пакет не запускается. Есть идеи?
Код следующий:
Тестирование
@SelectPackages("com.company.platform.test.suite")
@IncludeClassNamePatterns({"^.*Suite$"})
public class SuiteTest {
}
Тест вызывается SuiteTest
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class TestingSuite {
@Test
public void add_2_plus_1(){
Assertions.assertThat(2 + 1).isEqualTo(3);
}
}
Пом
<junit-jupiter-engine.version>5.5.0</junit-jupiter-engine.version>
<junit-platform-runner.version>1.5.0</junit-platform-runner.version>
<!-- ellided -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit-jupiter-engine.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit-jupiter-engine.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>${junit-platform-runner.version}</version>
</dependency>
<!-- ellided -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
Сведения о Maven, Java и ОС
mvn11 --version Sun Jul 21 14:43:24 EDT 2019
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: /usr/local/Cellar/maven/3.5.4/libexec
Java version: 11.0.1, vendor: Oracle Corporation, runtime: /Users/me/Downloads/jdk-11.0.1.jdk/Contents/Home
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "mac"
@RunWith(JUnitPlatform.class)
заставляет его работать на Junit4, если я его удалю, чтобы он запускал родной Junit5 - все равно не работает. Имейте в виду, что мои обычные тесты Junit4 работают, и мои тесты Junit5 тоже работают.
В этом случае вы должны предоставить работающий, но минимальный пример, чтобы другие, например я, могли воспроизвести проблему и, надеюсь, решить ее.
Добавлен последний сегмент кода, чтобы сделать его работоспособным
Только что заметил, что я неправильно выразился в первом комментарии: функция пакета, использующая @RunWith(JUnitPlatform.class)
, доступна только для JUnit 4. Он был создан для обеспечения тестирования JUnit 5 без поддержки JUnit 5. Ничего подобного для JUnit 5 не существует. Что я имел в виду под встроенной поддержкой, так это просто запускать простые тестовые примеры Jupiter из коробки, что вы уже делаете.
Да, я добавил @RunWith(JUnitPlatform.class)
, потому что "из коробки" он не запускался - и это тоже не помогло.
Поэтому я воспроизвел вашу проблему. При работе
mvn clean test
я получил следующий вывод (среди многих других):
Juli 23, 2019 8:17:30 VORM. org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder$DefensiveAnnotatedBuilder buildRunner
WARNING: Ignoring test class using JUnitPlatform runner: com.example.project.SuiteTest
Вот почему я посмотрел код DefensiveAllDefaultPossibilitiesBuilder$DefensiveAnnotatedBuilder
и нашел следующий комментарий:
/**
* Customization of {@link AnnotatedBuilder} that ignores classes annotated
* with {@code @RunWith(JUnitPlatform.class)} to avoid infinite recursion.
*/
private static class DefensiveAnnotatedBuilder extends AnnotatedBuilder {...}
Это убедительно свидетельствует о том, что наборы, использующие @RunWith(JUnitPlatform.class)
, игнорируются при прогоне через механизм платформы. Вы можете спросить команду junit 5, есть ли явный способ отключить этот механизм безопасности, но я думаю, что его нет.
Я предлагаю вам расширить конфигурацию maven-surefire-plugin, чтобы имитировать то, что вы делаете в пакете:
@SelectPackages("com.company.platform.test.suite")
@IncludeClassNamePatterns({"^.*Suite$"})
можно перевести во что-то вроде
<include>com.company.platform.test.suite/*Suite.java</include>
Хотя я не тестировал.
Что произойдет, если вы запустите его без @RunWith(JUnitPlatform.class)
- что я в конечном итоге и пытаюсь сделать?
Ничего не произошло. Это бегун JUnitPlatform, который подбирает другие аннотации. Без бегуна класс просто игнорируется. В Юпитере нет функции набора.
Но я не использую org.junit.runners.Suite
, класс называется Люкс, но это обычный класс. Почему Junit5, который запускает другие тесты, отмеченные org.junit.jupiter.api.Test
, не просто запускается. У вас ничего не происходит, у меня тоже ничего не происходит - так почему это происходит только для @SelectPackages
?
Не уверен, что вы меня троллите или я действительно настолько непонятен. Создание наборов тестов с аннотациями, такими как @SelectPackages и т. д., не поддерживается Jupiter. Это не имеет ничего общего с классом org.junit.runners.Suite.
Возможно, чтение этого закрытого выпуска Junit5 поможет избавиться от путаницы: github.com/junit-team/junit5/issues/1778
Это интересно, я думал, что @SelectPackages
была именно конструкцией Юпитера/Junit5, которая заменила Suite
. Ссылка, которую вы сказали, также ссылается на @RunWith(JUnitPlatform.class)
- я думаю, что внес путаницу, добавив это в уравнение, но я думаю, что у меня достаточно, чтобы продолжить с вашего отзыва и ссылки - спасибо.
Ваш класс набора фактически использует Junit4 для запуска тестов Junit5. Я думаю, вам нужна дополнительная зависимость от junit 4.12. Тем не менее, почему бы вам не использовать встроенную поддержку Junit5 в плагине maven surefire?