Spring Boot 2系列(十八):Spring Boot的测试

  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 提供了三种测试请求类型,分别是 WebTestClientMockMvcTestRestTemplate。其中 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);
}
}

/**
* webTestClientDemo
*/
@Test
public void webTestClientDemo() {
String responseBody = webTestClient.get().uri("/user/queryAll").exchange().expectStatus().isOk()
.expectBody(String.class).returnResult().getResponseBody();
System.out.println("--------------webTestClientDemo-------------" + responseBody);
}


/**
* TestRestTemplate
* @throws Exception
*/
@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));
}

/**
* MockMvc
* @throws Exception
*/
@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

Spring Boot 2系列(十八):Spring Boot的测试

http://blog.gxitsky.com/2018/06/20/SpringBoot-18-test/

作者

光星

发布于

2018-06-20

更新于

2022-06-17

许可协议

评论