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 GUI 和 CLI“mvn 测试”中都运行良好。这个被忽略了。我要测试的方法的目的是为 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);
        List<Object> requestData = Arrays.asList("16759408","","The Home Depot","Baltimore","MD","840",10,true,"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)

解决方法

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

import org.junit.jupiter.api.Test;

放置

import org.junit.Test;

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

,

你不能使用这种模式:

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

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

注意:使用语法,例如“foo/MyTest.java”、“/MyTest.java”、“MyTest”用于“test”参数(参见包含/排除)。**

Gary,你的问题是你在谈论 JUnit,但是是哪一个?有两个版本 4 和 5,更具体地说,您可以将源代码发布到我们的 Apache JIRA(或 Stackoverflow),然后作为提交者的我可以查看您的代码。实际上,没有它就无法重现,因为只有 stackoverflow 中的纯文本无法使您的问题在我这边重现。所以下次请总是附上一个链接,我们会看看。上周有一个人做到了,非常有帮助。

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

,

请参阅documentation

在你的情况下,命令应该变成:

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