问题描述
我有一个包含四个包的项目。有了他们三个,一切都很好。我已经生成了 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