Surefire maven 插件不执行其中一项测试

Surefire maven plugin does not execute one of the tests

我有一个包含四个包的项目。有了他们三个,一切都很好。我已经生成了 JUnit 测试,它们在构建期间或在我执行 运行ning mvn test 命令时执行。
但是我的第四个包裹,只包含一个class。我已经为它创建了一个 JUnit 测试,但是当我 运行 构建时,Surefire 没有看到这个测试 class。所有其他八个测试 classes 都被执行,但这个被忽略。
当我试图只执行这个测试时 class 明确地使用

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

我收到这些消息

[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“工具->Create/Update 测试”生成的,然后进行了编辑以反映方法功能。 但是,除了这个测试之外的所有测试在 Netbeans GUI 和 CLI“mvn test”中都运行良好。这个被忽略了。我要测试的方法的目的是为 REST API 客户端构建 HttpEntity。这是测试代码:

/**
 * 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 升级到 v.4.13.1 并将 surefire maven 插件升级到 v.3.0.0-M5 但它没有任何影响。

我尝试 运行 带 -e 选项的 mvn 并获得了以下堆栈跟踪,但它仍然没有给我任何关于它发生原因的线索。

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)

请参阅documentation

在您的情况下,命令应变为:

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

我确实找到了问题的原因。 不知何故,当 IDE 生成(并重新生成)该测试文件时,它为 @Test 注释放置了错误的导入。而不是

import org.junit.jupiter.api.Test;

它放置了

import org.junit.Test;

因此,jupiter 引擎,运行 by surefire 无法识别@Test 注解。 在我更正导入测试后执行。

你不能使用这个模式:

-Dtest=com.company.dpt.prj.pkg.MySpecificClassTest

因为 Surefire 和 Failsafe 插件不支持完全限定的 class 名称。它在文件系统上进行查找,因此我向您展示了如何在配置中使用斜线。文档指定了此选项,请在此处再次阅读:

注意:使用语法,例如“foo/MyTest.java”,“/MyTest.java”,“测试”参数的“MyTest”(参见includes/excludes)。**

Gary​​,你的问题是你在谈论 JUnit,但是是哪一个?有两个版本 4 和 5,更具体地说,您可以 post 我们的 Apache JIRA(或 Whosebug)的源代码,然后我作为提交者可以查看您的代码。真的,没有它就无法重现,因为只有 Whosebug 中的纯文本不能使你的问题在我这边重现。所以下次请始终附上 link,我们会看看。一个人上周做了,很有帮助。

关于Test注解的导入,不是Surefire插件无法识别@Test的导入。 :-) 真的,这是你的错,你没有编写正确的源代码 包括 POM 并且即使你在 POM。然后 Surefire 触发了 JUnit 库,然后负责识别注释 - 而不是 Surefire。如果结合使用 JUnit4 和 JUnit5-Jupiter,Surefire 算法会更喜欢使用 JUnit5,这就是注释 org.junit.Test 被忽略的原因,因为 Jupiter 找不到它和 Jupiter 的注释。

我在使用 Maven Surefire 插件 3.0.0-M5 的 Spring 引导项目中遇到了这个问题。 Spring Boot 正在为 junit4 和 junit5 提供依赖项。 Maven Surefire在选择提供者时有优先权,优先选择junit5 if available:

if the JUnit 5 Platform Engine is present in the project use junit-platform if the JUnit version in the project >= 4.7 and the <<>> configuration parameter has ANY value use junit47 provider if JUnit >= 4.0 is present use junit4 provider else use junit3.8.1

我所有的测试都是junit4测试,因此没有发现要执行的测试。我已经迁移了所有测试,请查看文档以找到设置提供程序的选项,也许有。