SpringBoot+junit5-快速入门: 创建一个api,并增加单元测试

-- SpringBoot-从零开始快速入门(创建一个api,并增加单元测试)
【官网】:https://spring.io/projects/spring-boot

应用场景

Spring Boot 可以轻松创建可以“直接运行”的独立的、生产级的基于 Spring 的应用程序。并拥有如下特征: 1)创建独立的 Spring 应用程序. 2)直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)。 3)提供自以为是的“入门”依赖项以简化您的构建配置。 4)尽可能自动配置 Spring 和 第三方库。 5)提供生产就绪功能,例如指标、健康检查和外部化配置。 6)完全无需代码生成,无需 XML 配置。

基础资源

jdk 1.8,springboot 2.5.10,junit5

使用须知

为什么要用Spring Boot? SpringBoot默认提供了大部分框架的使用方式,方便进行快速集成 , Spring Boot应用可以独立运行,符合微服务的开发理念, Spring Boot内置WEB容器,无需部署WAR包即可运行, Spring Boot提供了各种生产就绪型功能,如指标,健康检查和外部配置, Spring Boot通过网站提供了项目模板,方便项目的初始化, Spring Boot可以帮助我们非常简单、快速的构建起我们的项目,并能够非常方便进行后续开发、测试和部署。

配置步骤

A)基于SpringBoot创建并运行一个简单项目。

A1)前提准备。

 安装Jdk,参考:Window上JDK(oracle,open jdk)的下载安装与Java环境变量的原理,配置及验证

 安装Idea工具,参考:高效的java开发工具-JetBrains 旗下的IDEA的安装与配置

 A2)基于spirngboot项目模板生成网站:start.spring.io,来初始化项目。



设置POM,初始化Maven的配置。


 A3)添加示例Controller,初始化一个用于演示的测试API。

 A4)打开:http://localhost:8080/test进行验证运行效果。

A5)增加一个mvc controller的单元测试,验证api是否能访问。

step1)在POM中增加junit5的包引用


<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>



step2)添加一个unit测试类


package cn.net.config.ConfigLab.SpringBoot;
import org.junit.jupiter.api.*;
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.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import javax.annotation.Resource;
/*
*author:  配置啦 http://config.net.cn
*createDate:2022-3-5
* */
//@RunWith(SpringRunner.class)  //如果是junit4的话,就要加上@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoControllerTest {
    @Resource
    private MockMvc mockMvc;
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Test
    void contextLoads(){
    }
    @BeforeAll
    public static void beforeAll(){
        //logger.info("beforeAll");
    }
    @BeforeEach
    public void beforeEach(){
        //logger.info("beforeEach");//mockMvc=MockMvcBuilders.standaloneSetup(newIndexController()).build();
        mockMvc=MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
   @AfterEach
    public void afterEach(){
      //logger.info("afterEach");
    }
   @AfterAll
   public static void afterAll(){
     //logger.info("afterAll");
    }

    @Test
    public void testHello() throws Exception {
        //mockMvc = MockMvcBuilders.standaloneSetup(new DemoControllerTest()).build();
        RequestBuilder request=MockMvcRequestBuilders.get("/test")
                .param("rand","123")
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON);//请求类型JSON
                MvcResult mvcResult=mockMvc.perform(request)
                        .andExpect(MockMvcResultMatchers.status().isOk())//期望的结果状态200
             .andDo(MockMvcResultHandlers.print())//添加ResultHandler结果处理器,比如调试时打印结果(print方法)到控制台
              .andReturn();//返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理;
              int status=mvcResult.getResponse().getStatus();//得到返回代码
              String content=mvcResult.getResponse().getContentAsString();//得到返回结果
              //logger.info("status:"+status+",content:"+content);
    }
}




常见问题

  • spring-boot-maven-plugin not found 报红,找不到
    【解决方案】添加版本:<version>2.5.10</version>, 版本号和parent节点下org.springframework.boot的版本保持一致
  • CONDITIONS EVALUATION REPORT,'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean
    【解决方案】需要增加一个注解@AutoConfigureMockMvc
  • CONDITIONS EVALUATION REPORT,javax.sql.DataSource
    【解决方案】由于mybatis没有设置mapper扫描: 解决方法:第一种可以在每个dao层的mapper接口上添加'@mapper'注解、第二种可以在springbbot启动类上添加@mapperscan(“包路径”)

快速入门

参考资料