Spring Boot 不运行单元测试

Posted

技术标签:

【中文标题】Spring Boot 不运行单元测试【英文标题】:Spring boot doesn't run unit tests 【发布时间】:2017-02-20 08:15:03 【问题描述】:

如何在使用spring boot:run 命令构建和部署时为 Spring Boot 应用程序运行单元测试。

我的期望是在运行应用程序之前执行我的所有单元测试,但我不想在之前创建另一个像 mvn test 这样的 maven 命令。

我的问题: 我制作了一个简单的 Spring Boot 应用程序,我可以找到一种在从 intellij 或命令行运行应用程序时运行单元测试的方法。首先,我认为可能是我的配置错误或测试类的名称错误,或者项目结构错误。所以我从intellij模板创建了spring boot应用程序。令我高兴的是,它已经编写了默认测试,所以我只需运行应用程序。很遗憾没有执行测试。

这是intellij创建的项目结构、pom.xml、主类和单元测试截图。Project created by intetelij

我将测试运行器和测试更改为失败并再次尝试。结果相同。 unit test changed to fail

我在这里搜索了spring boot:run 命令下面隐藏的内容 http://docs.spring.io/spring-boot/docs/current/maven-plugin/run-mojo.html

我在手册的顶部发现了一些有趣的东西:“在执行自身之前调用生命周期阶段测试编译的执行。”所以我的理解是这个命令只编译测试而不运行它们?如果是这样,问题是 - 是否可以通过在命令中添加一些标志来添加“测试”阶段?

【问题讨论】:

你想要实现完全无法使用的东西。生产代码是一部分,测试代码是另一部分。弹簧靴只使用生产代码。通常在构建/部署过程中使用单元测试来验证生产代码的正确性。为什么要在生产环境中运行单元测试?您可能在这里误解了一些东西。 也许我没有清楚地说明我的问题。我唯一要寻找的是在运行正常的 Spring Boot 应用程序之前执行单元测试。对于我所有的 maven 项目,我刚刚做了 mvn clean install 并在部署应用程序之前执行了测试。现在我也想做同样的事情。据我所知,在使用spring boot:run 运行 Spring Boot 应用程序时,所有项目首先在部署之前编译。那么在部署应用程序之前是否有可能运行单元测试?我知道我可以在spring boot:run 之前运行mvn test,但我只是好奇我是否可以使用一个命令来完成它:) 是什么阻止你执行 mvn test spring-boot:run ?在 IntelliJ 中,您可以创建将执行它的 Maven 运行配置。 【参考方案1】:

您的问题与 Maven 生命周期有关。根据docs为spring-boot:run,默认绑定到生命周期阶段validate,执行前调用阶段test-compile

您要求的是在运行应用程序之前执行测试。您可以使用 POM 中的自定义 maven 配置文件来执行此操作 - 如下所示。

<project>
    <profiles>
        <profile>
            <id>test-then-run</id>
            <build>
                <defaultGoal>verify</defaultGoal>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>spring-boot-run</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <inherited>false</inherited>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        ...
    </profiles>
...
</project>

在您的 POM 中使用它,然后您可以运行测试并启动应用程序:

mvn -P test-then-run

这会将run 目标绑定到verify 阶段而不是validate 阶段,这意味着将首先运行测试。您可以在此处查看各个阶段的运行顺序:https://maven.apache.org/ref/3.3.9/maven-core/lifecycles.html

【讨论】:

【参考方案2】:

我知道我可以在运行应用程序之前使用 mvn test。事实上,它可以通过 intellij 中的多种方式来实现。对我来说,我只是在启动应用程序之前添加 mvn 目标测试:

intellij 中的弹簧启动配置。 当然,它可能会有所不同。

问题是,我只是很好奇我是否可以通过使用一些标志或其他方式以某种方式操纵 spring boot:run 命令以获得相同的结果,但这是不可能的。

olambert,也感谢您的回答,效果很好。

【讨论】:

如果您对答案感到满意,请为所有有用的答案投票并接受最佳答案。 不幸的是,我没有足够的声望点来公开显示我的赞成票。 :) 确实需要 15 个代表。 ***.com/help/whats-reputation 一些有意义的编辑(更正拼写错误、标签、格式)将很快让您获得所需的 15 声望:***.com/help/whats-reputation 回答问题更好:) 祝您使用 *** 好运!

以上是关于Spring Boot 不运行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 单元测试运行整个程序

使用 spring boot 运行单元测试,“没有可运行的方法”错误

编辑并重新运行 Spring Boot 单元测试,无需重新加载上下文以加快测试速度

Spring Boot / JUnit,为多个配置文件运行所有单元测试

如何为我的 Spring Boot 控制器执行单元测试?

spring boot 学习之二(spring boot单元测试)