java - 为什么运行 mvn clean install 命令(在 Spring Boot 项目上)如果我注释掉这些方法以跳过测试,我也会获得单元测试失败?
问题描述
几年来我没有使用 Spring\Spring Boot,我正在使用这项技术开始一个项目,所以我有一些疑问。
我正在处理一个从 GIT 检索的简单项目,并开始着手实现我的功能。它工作正常,但我有以下疑问。
从命令行(进入我的项目的根目录)我使用以下命令编译它:
mvn clean install
为了删除我的应用程序的先前版本,然后再次编译、测试和打包我的应用程序。
然后我通过这个命令启动我的应用程序:
mvn spring-boot:run
并且应用程序正确启动:
它开始没有问题。当我执行mvn clean install命令时,我怀疑是在前一个阶段。它还执行项目内部定义的单元测试,但所有测试都失败了。这里有奇怪的行为。
我得到这样的异常:
Running com.springboot.excelapi.integration.ExcelResourceUnitTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.001 sec <<< FAILURE! - in com.springboot.excelapi.integration.ExcelResourceUnitTest
initializationError(com.springboot.excelapi.integration.ExcelResourceUnitTest) Time elapsed: 0 sec <<< ERROR!
java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:138)
at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
在 Maven 安装阶段结束时,我有以下总结,说明所有测试都失败了:
Tests run: 4, Failures: 0, Errors: 2, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.251 s
[INFO] Finished at: 2020-02-16T19:24:02+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project excel-api: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\nobil\Documents\workspace-sts-3.9.11.RELEASE\spring-boot-excel-api-master.zip_expanded\spring-boot-excel-api-master\target\surefire-reports for the individual test results.
[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 类中注释掉了所有的测试方法。例如前面的错误与这个测试类有关:
package com.springboot.excelapi.integration;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import com.springboot.excelapi.Application;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { Application.class })
@WebAppConfiguration
@ActiveProfiles(profiles = { "no-liquibase" })
public class ExcelResourceUnitTest {
/*
@Test
public void processCompVibrAndTempoExcelTabTest()
{
final ExcelService excelService = new ExcelService();
try {
excelService.processCompVibrAndTempExcelTab();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
*/
}
正如你所看到的,这个类包含一个被注释掉的测试方法。
那么为什么当我执行mvn clean install命令时,它似乎正在尝试通过注释掉它来执行目前被禁用的测试方法?
解决方案
如果您不想@Ignore
在类或单个测试方法上运行测试。
似乎仍有测试在运行(maven 总结了 4 个测试),所以总而言之,您可能不应该总是运行mvn -DskipTests clean install
或至少不总是运行它,因为您仍然希望运行工作测试。
现在至于错误,你应该至少有一个公共方法注释@Test
所以留下方法但注释掉它的内容(同样,IMO最好使用@Ignore
我之前说过的)
推荐阅读
- sml - 使用 SML 和 HOL 推理规则从第一原理证明定理
- android - 在 Android 中显示来自 Firebase 的所有数据
- python - TensorFlow 没有正式命名的模块
- javascript - 'jQuery' 未定义 no-undef
- javafx - JavaFX - 测试 GridPane 单元格是否为空时出现 InvocationTargetException
- java - Java ExecutorService 顺序-Spring MVC
- php - 尽管启用了mbstring,但调用未定义的函数mb_convert_encoding()
- java - Drools - 使用 java 常量作为 drools 规则名称
- nginx - 使用 nginx map 指令动态设置代理上游
- c - Visual Studio - C 编程