首页 > 数据库 > 数据库开发技术 > Spring Boot单元测试快速入门Demo
软件测试是一个应用软件质量的保证。开发者开发接口往往忽视接口单元测试。如果会Mock单元测试,那么你的bug量将会大大降低。spring提供test测试模块。整体上,Spring Boot Test支持的测试种类,大致可以分为如下三类:
单元测试:一般面向方法,编写一般业务代码时,测试成本较大。涉及到的注解有@Test。
切片测试:一般面向难于测试的边界功能,介于单元测试和功能测试之间。涉及到的注解有@RunWith @WebMvcTest等。
功能测试:一般面向某个完整的业务功能,同时也可以使用切面测试中的mock能力,推荐使用。涉及到的注解有@RunWith @SpringBootTest等。
功能测试过程中的几个关键要素及支撑方式如下:
测试运行环境:通过@RunWith 和 @SpringBootTest启动spring容器。
mock能力:Mockito提供了强大mock功能。
断言能力:AssertJ、Hamcrest、JsonPath提供了强大的断言能力。
实验目的:验证cotroller和service层逻辑
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>test</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
server:port: 8088username: default
server:port: 8088username: dev
package com.et.test.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;import java.util.Map;@Controllerpublic class HelloWorldController {@RequestMapping("/hello")@ResponseBodypublic Map<String, Object> showHelloWorld(){Map<String, Object> map = new HashMap<>();map.put("msg", "HelloWorld");return map;}}
package com.et.test.service;import org.springframework.stereotype.Service;/*** @ClassName UserService* @Description TODO* @Author liuhaihua* @Date 2024/4/4 13:13* @Version 1.0*/public interface UserService {public String getUserName();}
package com.et.test.service;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;/*** @ClassName UserServiceImpl* @Description TODO* @Author liuhaihua* @Date 2024/4/4 13:16* @Version 1.0*/public class UserServiceImpl implements UserService{private String username;public String getUserName() {return username;}}
package com.et.test;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
以上只是一些关键代码,所有代码请参见下面代码仓库
https://github.com/Harries/springboot-demo
可以切换不同的环境,在同的环境上测试
public void bookApiTest() throws Exception {// mockbean startuserServiceMockBean();// mockbean endString expect = "{\"msg\":\"HelloWorld\"}";mockMvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.content().json(expect)).andDo(MockMvcResultHandlers.print());// mockbean reset}
@Testpublic void execute() {userServiceMockBean();log.info("username:"+userService.getUserName());Assertions.assertThat(userService.getUserName().equals("mockname"));}
下面是完整的测试代码,感兴趣的可以去测试一下
package com.et.test;import com.et.test.service.UserService;import org.assertj.core.api.Assertions;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.BDDMockito;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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.boot.test.mock.mockito.MockBean;import org.springframework.test.context.ActiveProfiles;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;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 javax.annotation.Resource;@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)@ActiveProfiles("dev")@AutoConfigureMockMvcpublic class DemoTests {private Logger log = LoggerFactory.getLogger(getClass());@Resourceprivate MockMvc mockMvc;//@Autowired@MockBeanUserService userService;@Beforepublic void before() {log.info("init some data");}@Afterpublic void after(){log.info("clean some data");}@Testpublic void execute() {userServiceMockBean();log.info("username:"+userService.getUserName());Assertions.assertThat(userService.getUserName().equals("mockname"));}@Testpublic void bookApiTest() throws Exception {// mockbean startuserServiceMockBean();// mockbean endString expect = "{\"msg\":\"HelloWorld\"}";mockMvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.content().json(expect)).andDo(MockMvcResultHandlers.print());// mockbean reset}public void userServiceMockBean() {BDDMockito.given(userService.getUserName()).willReturn("mockname");}}
https://spring.io/guides/gs/testing-web
http://www.liuhaihua.cn/archives/710395.html
原文作者:HBLOG;如有侵权,请联系管理员删除。