У меня есть проект с четырьмя пакетами. С тремя все нормально. Я сгенерировал тесты JUnit, и они выполняются во время сборки или когда я запускаю команду mvn test.
А вот мой четвертый пакет, содержащий всего один класс. Я создал для него тест JUnit, но когда я запускаю сборку, Surefire не видит этот тестовый класс. Все остальные восемь тестовых классов выполняются, но этот игнорируется.
Когда я пытаюсь выполнить только этот тестовый класс, явно используя
mvn -Dtest=com.company.dpt.prj.pkg.MySpecificClassTest тест
Я получаю эти сообщения
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.058 s
[INFO] Finished at: 2020-12-19T23:58:01-08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project my-project-name: No tests were executed! (Set -DfailIfNoTests=false to ignore this error.) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
Я просмотрел тестовый код построчно и не смог найти причин такого поведения.
Я даже удалил тестовый файл и восстановил очень простой. Он до сих пор не выполнен.
Кто-нибудь сталкивался с чем-то подобным? Любая подсказка будет принята с благодарностью, так как я не мог найти никаких подсказок.
Я использую JUnit 4.11
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.11</version>
</dependency>
Все тесты изначально были сгенерированы с использованием Netbeans v.12 «Инструменты-> Создать/обновить тест», а затем отредактированы для отражения функциональности методов. Однако все тесты, кроме этого, работают нормально как в графическом интерфейсе Netbeans, так и в CLI «mvn test». Этот игнорируется. Цель метода, который я хочу протестировать, — создать HttpEntity для клиента REST API. Вот код теста:
/**
* Test of prepareRequest method, of class BatchServiceClient.
* @throws java.net.URISyntaxException
*/
@Test
public void testPrepareRequest() throws URISyntaxException {
System.out.println("prepareRequest");
ObjectMapper mapper = Json.mapper();
URL configFileUrl = this.getClass().getClassLoader().getResource("config_f.json");
if (configFileUrl == null) {
fail("Missing configuration file");
} else {
File configFile = new File(configFileUrl.toURI());
BatchConfig config = BatchConfigLoader.loadConfig(configFile);
assertNotNull(config);
boolean validated = config.validate();
assertTrue(validated);
BatchServiceClient client = new BatchServiceClient(config, null, null, null, null, null, null);
List<Object> requestData = Arrays.asList("16759408", "", "", "", "The Home Depot", "",
"Baltimore", "MD", "", "840", "", "", "", "", "", "", "", "", "", "", 10, "",
true, true, "merchantName", "merchantName", "merchantName");
HttpEntity<String> request = client.prepareRequest(requestData);
assertNotNull(request);
}
}
Моя проблема в том, что он не терпит неудачу в тестовом коде. Я буду рад, если это будет, потому что я смогу отладить это, чем. Это просто не выполняется. Я попытался обновить JUnit до версии 4.13.1 и плагин surefire maven до версии 3.0.0-M5, но это не оказало никакого влияния.
Я попытался запустить mvn с опцией -e и получил следующую трассировку стека, но это все еще не дало мне никаких подсказок о том, почему это происходит.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:564)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.MojoFailureException: No tests were executed! (Set -DfailIfNoTests=false to ignore this error.)
at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution (SurefireHelper.java:149)
at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary (SurefirePlugin.java:364)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked (AbstractSurefireMojo.java:1041)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute (AbstractSurefireMojo.java:857)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:564)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Добавьте полный файл pom и попробуйте вместо этого mvn -Dtest=MySpecificClassTest test
...
вы выполняете его через параметр командной строки или графический интерфейс IntelliJ?
Выполняется ли он, если вы просто mvn test
?
Выше я сказал, что команда «mvn test» выполняет 8 других тестов, но не этот. И не имеет значения, указываю ли я тест mvn -Dtest=MySpecificClassTest или использую полное имя класса. Результат тот же.
Просто, чтобы попытаться изолировать причину. Выполняется ли он, если вы переместите этот тестовый метод в классы рабочих пакетов? А если перенести в этот класс любой из рабочих тестовых методов?
Я скопировал/вставил этот тестовый метод в другой файл, и он был проигнорирован. Тем не менее, это помогло мне найти причину проблемы. Спасибо, Матеу. См. решение ниже.
Пожалуйста, ознакомьтесь с документацией.
В вашем случае команда должна стать:
mvn -Dtest=com/company/dpt/prj/pkg/MySpecificClassTest.java test
Боюсь, вы невнимательно читали документацию. В нескольких примерах упоминается файл класса, а не исходный файл Java: >mvn -Dtest=TestCircle test Однако я пытался запустить его, как вы упомянули. Результат был тот же.
:-) Я говорю вам, что вы должны использовать пакет, если хотите запустить определенный класс.
Я нашел причину проблемы. Каким-то образом, когда IDE сгенерировала (и регенерировала) этот тестовый файл, она поместила неправильный импорт для аннотации @Test. Вместо
import org.junit.jupiter.api.Test;
он поместил
import org.junit.Test;
Таким образом, Jupiter Engine, запущенный surefire, не распознал аннотацию @Test. После того, как я исправил импорт, был выполнен тест.
Вы не можете использовать этот шаблон:
-Dtest=com.company.dpt.prj.pkg.MySpecificClassTest
потому что подключаемый модуль Surefire и Failsafe не поддерживает полное имя класса. Он выполняет поиск в файловой системе, и поэтому я показал вам, как использовать косые черты в конфигурации. В документации указан этот параметр, прочтите его еще раз здесь:
ПРИМЕЧАНИЕ. Используйте синтаксис, например. "foo/MyTest.java", "/MyTest.java", "MyTest" для параметра "тест" (см. включает/исключает).**
Гэри, твоя проблема в том, что ты говоришь о JUnit, но о каком? Есть две версии 4 и 5, и, что более конкретно, вы можете опубликовать исходный код в нашем Apache JIRA (или в Stackoverflow), и тогда я, как коммиттер, смогу просмотреть ваш код. На самом деле это невозможно воспроизвести без него, потому что только чистый текст в stackoverflow не может сделать вашу проблему воспроизводимой на моей стороне. Поэтому, пожалуйста, всегда прикрепляйте ссылку в следующий раз, и мы посмотрим. Один парень сделал это на прошлой неделе, и это было очень полезно.
Что касается импорта аннотации Test, это не плагин Surefire, который не распознал импорт @Test. :-) Действительно, это ваша вина, что вы не написали надлежащий исходный код, включая POM, и компилятор скомпилировал код как есть, даже если вы объединили JUnit4 и JUnit5 в POM. Затем Surefire запустил библиотеки JUnit, которые отвечают за распознавание аннотаций, а не Surefire. Алгоритм Surefire предпочел бы использовать JUnit5, если вы комбинируете JUnit4 и JUnit5-Jupiter, и по этой причине аннотация org.junit.Test была проигнорирована, поскольку Jupiter не находит ее и аннотацию Jupiter.
У меня была эта проблема в проекте Spring Boot вместе с плагином Maven Surefire 3.0.0-M5. Spring Boot предоставляет зависимости для junit4 и junit5. Maven Surefire имеет приоритет при выборе поставщика и сначала выбирает junit5 , если он доступен :
если в проекте присутствует JUnit 5 Platform Engine использовать junit-платформу если версия JUnit в проекте >= 4.7 и параметр конфигурации <<>> имеет ЛЮБОЕ значение использовать провайдер junit47 если присутствует JUnit >= 4.0 использовать провайдер junit4 еще используйте junit3.8.1
Все мои тесты были тестами junit4, и, следовательно, ни один тест не был выполнен. Я перенес все тесты, посмотрите в документации, чтобы найти возможность установить поставщика, может быть, он есть.
Не могли бы вы добавить источник теста и указать версию Junit и относительный путь к тесту.