Spring Boot,每次新建项目都会自动加上spring-boot-starter-test
的依赖,同时在src/test/java
生成当前项目的测试类。
Spring Boot 的测试由两个模块提供支持:spring-boot-test 提供测试的核心功能,spring-boot-test-autoconfigure 提供测试的自动配置。
Spring Boot 提供了 @SpringBootTest
注解, 用于替换 spring-test 的 @ContextConfiguration
注解, 该注解通过 SpringApplication 创建用于测试的 ApplicationContext, 就可以调用 Spring Boot 的功能。
Spring Boot 关于使用 Mock 测试 Spring MVC 可以参考SpringMVC使用MockMvc和Junit进行单元测试 ,官方文档-测试特性(boot-features-testing) 。
Spring Boot 提供了三种测试请求类型,分别是 WebTestClient
, MockMvc
,TestRestTemplate
。其中 WebTestClient 的自动配置由 spring-boot-starter-webflux 提供。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 package com.springboot.jpa;import com.alibaba.fastjson.JSON;import com.springboot.jpa.entity.User;import com.springboot.jpa.repository.UserRepository;import org.junit.Assert;import org.junit.Before;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.boot.test.context.TestConfiguration;import org.springframework.boot.test.web.client.TestRestTemplate;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.context.annotation.Bean;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.reactive.server.WebTestClient;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.context.WebApplicationContext;import java.util.List;@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Transactional public class JpaApplicationTests { String userListStr; @Autowired private UserRepository userRepository; @Autowired private TestRestTemplate testRestTemplate; @Autowired private WebTestClient webTestClient; MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp () { User user1 = new User().setId(11L ).setAge(11 ).setName("Linker" ).setAddress("深圳。。。。。" ); User user2 = new User().setId(12L ).setAge(12 ).setName("Kinger" ).setAddress("广州。。。。。" ); userRepository.save(user1); userRepository.save(user2); List<User> userList = userRepository.findAll(); userListStr = JSON.toJSONString(userList); mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); System.out.println(userListStr); } @TestConfiguration static class Config { @Bean public RestTemplateBuilder restTemplateBuilder () { return new RestTemplateBuilder().setConnectTimeout(1000 ).setReadTimeout(1000 ); } } @Test public void webTestClientDemo () { String responseBody = webTestClient.get().uri("/user/queryAll" ).exchange().expectStatus().isOk() .expectBody(String.class).returnResult().getResponseBody(); System.out.println("--------------webTestClientDemo-------------" + responseBody); } @Test public void testRestTemplateDemo () throws Exception { ResponseEntity<String> entity = this .testRestTemplate.getForEntity("/user/queryAll" , String.class); System.out.println("------------" + entity.getBody().toString()); System.out.println("------------" + entity.getStatusCode()); System.out.println("------------" + entity.getStatusCodeValue()); System.out.println("------------" + JSON.toJSONString(entity)); } @Test public void mockMvcDemo () throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/user/queryAll" ) .accept(MediaType.APPLICATION_JSON_UTF8)).andReturn(); int status = result.getResponse().getStatus(); String content = result.getResponse().getContentAsString(); Assert.assertEquals("error,错误消息" , 200 , status); } }
源码 -> Github