Плагин Surefire maven не выполняет один из тестов

У меня есть проект с четырьмя пакетами. С тремя все нормально. Я сгенерировал тесты 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)

Не могли бы вы добавить источник теста и указать версию Junit и относительный путь к тесту.

zforgo 20.12.2020 09:55

Добавьте полный файл pom и попробуйте вместо этого mvn -Dtest=MySpecificClassTest test...

khmarbaise 20.12.2020 10:02

вы выполняете его через параметр командной строки или графический интерфейс IntelliJ?

Govinda Sakhare 20.12.2020 10:12

Выполняется ли он, если вы просто mvn test?

Software Engineer 20.12.2020 12:46

Выше я сказал, что команда «mvn test» выполняет 8 других тестов, но не этот. И не имеет значения, указываю ли я тест mvn -Dtest=MySpecificClassTest или использую полное имя класса. Результат тот же.

Gary Greenberg 20.12.2020 20:29

Просто, чтобы попытаться изолировать причину. Выполняется ли он, если вы переместите этот тестовый метод в классы рабочих пакетов? А если перенести в этот класс любой из рабочих тестовых методов?

Gonzalo Matheu 21.12.2020 03:09

Я скопировал/вставил этот тестовый метод в другой файл, и он был проигнорирован. Тем не менее, это помогло мне найти причину проблемы. Спасибо, Матеу. См. решение ниже.

Gary Greenberg 21.12.2020 22:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
2 316
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Пожалуйста, ознакомьтесь с документацией.

В вашем случае команда должна стать:

mvn -Dtest=com/company/dpt/prj/pkg/MySpecificClassTest.java test

Боюсь, вы невнимательно читали документацию. В нескольких примерах упоминается файл класса, а не исходный файл Java: >mvn -Dtest=TestCircle test Однако я пытался запустить его, как вы упомянули. Результат был тот же.

Gary Greenberg 21.12.2020 21:31

:-) Я говорю вам, что вы должны использовать пакет, если хотите запустить определенный класс.

tibor17 22.12.2020 08:13
Ответ принят как подходящий

Я нашел причину проблемы. Каким-то образом, когда 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, и, следовательно, ни один тест не был выполнен. Я перенес все тесты, посмотрите в документации, чтобы найти возможность установить поставщика, может быть, он есть.

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