在本文中,我们将介绍可以响应HTTP请求的非常基本的Web服务。对于希望开始使用Spring Boot的人来说,此博客非常理想。




springboot 测试类无法运行_springboot test测试类


为什么选择Spring Boot?

那么,为什么您作为Java开发人员应该关心Spring Boot?好吧,有很多很好的理由!Spring首先,Spring是开源的,这意味着它由社区不断维护和测试,并且是免费的或免费的。第二,根据Hotframeworks,它是2019年使用最广泛的 Java Web框架。第三,有一种绝佳的方法可以快速启动并运行 Spring应用程序,这就是Spring Boot发挥作用的地方:得益于Spring Boot,您无需担心很多样板代码和配置。Spring Boot会自动为您设置许多配置默认值,但是如果需要,您始终可以覆盖这些默认值。为此,Spring Boot是有主见的,这意味着Spring团队中的人员为您选择了一些配置,但这些配置已为社区所接受。

顺便说一句,为什么我们要完全关心Web框架?嗯,在典型的Web服务中有很多项被一遍又一遍地使用,例如答复HTTP请求,为每个传入请求扩展新线程,诸如HTTPS和OAUTH2之类的安全机制等等。我们不想在每次创建新的Web服务时都重新发明轮子,为此,我们可以将Web框架与所有提供的常见机制一起使用。Web框架的其他功能包括数据库访问,任务调度,控制反转等。

最后,我要说的是,Spring不仅与Java兼容,而且与Kotlin(一种在Android应用程序中非常流行的语言)兼容。

先决条件

现在,我们将创建一个hello-world Web服务。所有必要的代码都在这里给出,最终的解决方案也可以在我的Github存储库中找到。

必须遵循所有步骤:

  • 马文
  • Java JDK 8或更高版本
  • 命令行

对于此博客,我们将从命令行完成所有工作。或者,您可以使用像IntelliJ这样的IDE。实际上,我将很快发布有关IntelliJ的帖子,并介绍一些入门性主题,例如代码完成,在项目中搜索给定的代码片段,编译,调试等。

使用Spring Initializr

我们使用Maven作为构建工具,Spring Boot提供了一种创建POM文件的好方法:转到https://start.spring.io/,然后输入我们应用程序的所有详细信息,如下所示:


springboot 测试类无法运行_spring_02


当然,如果愿意,可以使用较新版本的Spring Boot和Java。无论如何,请记住将“ Spring Web”添加为入门依赖项–我们将其用于REST端点。填写完所有详细信息后,请使用“生成”按钮。这将下载具有初始Java项目结构(最重要的是初始pom.xml文件)的ZIP 文件。

让我们仔细看看生成的POM文件。在POM的顶部,您可以看到我们继承自spring-boot-starter-parent,其中包含Spring-Boot应用程序的所有必需品。

org.springframework.boot    spring-boot-starter-parent    2.2.6.RELEASE

在POM中的下方dependencies,您可以看到我们将使用spring-boot-starter-web:

org.springframework.boot      spring-boot-starter-web

您可以在mvnrepository.com上找到有关此依赖关系的不错描述:

使用Spring MVC构建Web(包括RESTful)应用程序的入门者。使用Tomcat作为默认的嵌入式容器。

无论如何,到目前为止,我们只看了一个重要文件:pom.xml文件。接下来,让我们专注于主类,您可以在下面找到src/main/java/com/example/springbootexample/SpringBootExampleApplication.java:

@SpringBootApplicationpublic class SpringBootExampleApplication {  public static void main(final String[] args) {    SpringApplication.run(SpringBootExampleApplication.class, args);  }}

这里有趣的只是顶部的注释:@SpringBootApplication。其中,此注释可确保我们的Spring Boot应用程序配置了默认的Spring Boot属性(例如,HTTP请求的超时以及许多其他内容)。

Hello-World REST端点

由于我们稍后要创建REST端点,因此我们需要Main类来搜索Servlet,因此我们需要在Main类中@ServletComponentScan再添加一个注释:(同样,如果今天是您的day懒日子,并且您不想要进行任何编码,您可以在我的Github存储库中查看完整的代码。

接下来,让我们创建一个REST端点。为此,我们创建一个新的Java类并调用它PingRestController.java(您可以使用与Main类相同的文件夹)。

的内容PingRestController.java应如下所示:

package com.example.springbootexample;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class PingRestController {  @RequestMapping(method = RequestMethod.GET, path = "/api/ping")  public ResponseEntity getPing() {    return ResponseEntity.ok("pong");  }}

注释@RestController表示该类包含REST端点。每个REST端点都是一个用注释的方法@RequestMapping。在这种情况下,我们只有一种这样的方法:getPing。每当相应的REST调用到达我们的服务器时,都会执行此方法。让我们更详细地查看@RequestMapping批注:我们指定method和path变量。这两个变量指定我们要捕获对URI“ / api / ping”的HTTP GET请求。另外,请注意getPing方法的返回类型:A ResponseEntity包装了HTTP答案,并且HTTP主体应该只是一个String。因此,对HTTP调用的响应将始终如下所示:

Headers: Status: 200, ContentType: text/plain;charset=UTF-8Body: "pong"

通过修改后的Main类和PingRestController类,我们已经准备好运行我们的服务。在终端中,键入:

mvn clean installjava -jar target/spring-boot-example-0.0.1-SNAPSHOT.jar

现在,在您喜欢的Web浏览器中,键入:

localhost:8080/api/ping

您应该看到“ pong”响应!

后台发生的事情是您的浏览器向本地主机发出HTTP GET请求,该请求由您的Spring Boot应用处理并以字符串“ pong”响应。

整合测试

确保我们的REST端点真正起作用的一种好方法是编写集成测试。每次我们构建应用程序时都会运行此测试。我们为什么要使用集成测试?首先,因为我们的开发人员希望使一切自动化,并且不喜欢手动测试。其次,因为这为将来的开发增加了稳定性:随着我们的Web服务将被扩展,此测试将在每个构建版本中仍然运行,并且我们可以确保此功能仍然有效。

什么是集成测试?与仅关注一个类的单元测试相反,集成测试适用于我们整个应用程序,其中所有组件都集成在一起。我们通常模拟数据库等第三方系统,因此我们可以独立于(有时是不可靠的)周围系统进行测试。在我们的例子中,我们想真正地启动我们的Web服务,但是如果我们有一个数据库,那么我们将对其进行仿真。

我们在src/test/java/com/example/springbootexample/PingIntegrationTest.java以下方面实施集成测试:

package com.example.springbootexample;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.test.web.servlet.MockMvc;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;@ExtendWith(SpringExtension.class)@SpringBootTest@AutoConfigureMockMvcpublic class PingIntegrationTest {  @Autowired  private MockMvc mvc;  @Test  public void testHelloWorldEndpoint() throws Exception {    String response = mvc        .perform(get("/api/ping"))        .andReturn().getResponse().getContentAsString();    assertEquals("Hello world", response);  }}

如您所见,测试REST端点需要花费更多的代码。现在,让我们只关注有趣的部分,我将让您了解每一行代码。因此,这里是要点:

  • @SpringBootTest:在本地启动Web服务器,并准备好应答以测试REST调用
  • private MockMvc mvc:一个MockMvc对象允许我们向Web服务器发射测试HTTP调用
  • @Test:与Junit-Tests一样,每个测试都以@@ test注释的方法实现 。
  • mvc.perform(get(“api/ping”)):在这里我们触发一个HTTP GET请求

您可以使用以下命令运行测试:

mvn -Dtest=PingIntegrationTest test

Aaaaand ...集成测试失败发生了什么事?不用担心,上述测试用例中只有一个很小的错误。我将留给您查找错误原因并进行修复!

弹簧配置

Spring Boot自动配置服务的许多属性。例如,当我们ping我们自己的服务时,我们不得不使用端口8080。现在我们没有在任何地方定义它……这只是Spring Boot的默认设置。所有这些默认属性都可以在此处的官方文档中找到。要更改此默认行为,我们要做的就是创建一个application.properties文件并覆盖适当的值。因此,继续进行修改src/main/resources/application.properties:

server:  port: 8082

现在,当您重新编译并重新启动服务时,REST端点将在端口8082上可用。

结论

我们已经介绍了创建简单REST服务所需的所有代码。使用Spring Boot,我们只需要总共23行Java代码来创建有效的REST端点!而且,所需的XML配置为零。