SpringBoot开发者工具及单元测试
springboot开发者工具及单元测试
一、使用devtools热部署
1、idea与eclipse运行和编译的区别:
①eclipse没有自动保存的功能,所有我们在使用eclipse时,保存之后,eclipse就进行编译了,点击运行就直接运行了,所以启动时,eclipse相对较快
②idea是点击运行的时候,才进行编译,然后运行的。
2、使用热部署后,我们只需要点击编译,项目即重新编译运行。
3、热部署默认只会对类的修改进行重新编译,对静态资源无效
①配置静态资源的热部署
任选一种即可
spring:
devtools:
restart:
# 包含能够热部署的位置 (需要从src下进行配置)
additional-paths: src/main/resources/static
# 排除默认配置中不能热部署的位置
# exclude: classpath:/static/**
pom.xml
spring-boot-devtools
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!--只在运行时有效-->
<scope>runtime</scope>
<!--防止devtools传递到其他模块 即修改该类时,引用该模块的不需要动态更新-->
<optional>true</optional>
</dependency>
<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>
</dependencies>
4、使用liveReload插件动态更新静态资源
google下载liveReload插件
这里我们禁用了只要修改文件就自动编译。而是我们修改之后去手动点击编译。
修改静态文件后==> 点击编译==>点击浏览器liveReload即可动态刷新页面
禁止自动更新页面:
spring:
devtools:
livereload:
enabled: false
5、禁用热部署(如果pom中有此依赖)
spring:
devtools:
restart:
enabled: false
或者==>
@SpringBootApplication
public class JpaRestApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(JpaRestApplication.class, args);
}
}
6、使用触发文件进行重启
spring:
devtools:
restart:
trigger-file: .trigger-file
在resources下新建一个名为.trigger-file.txt的文件==>
当类修改时,编译不会重启,修改.trigger-file.txt ,再点击编译 ,即可重启
当类没有修改时,编译不会重启,修改.trigger-file.txt,再点击编译,也不会重启
7、使用全局触发文件
当我们使用微服务的时候,只要引用了该修改的模块的都重新加载
在我们当前用户下新建一个
.spring-boot-devtools.properties
文件==>
spring.devtools.restart.trigger-file=.trigger-file
在resources下新建一个
.trigger-file
文件==>
修改此内容则全局更新引用了该模块的内容
二、springboot中使用单元测试
1、基本配置
①pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
②Test
@RunWith(SpringRunner.class): 使用junit4测试
@SpringBootTest(classes = JpaRestApplication.class) : 找到主程序
在springboot我们可以省略指定主程序,springboo自动帮我们寻找主程序
@SpringBootTest即可
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JpaRestApplication.class)
class JpaRestApplicationTests {
@Autowired
private BookService bookService;
@Test
void contextLoads() {
bookService.hello();
}
}
2、对接口进行测试
①使用MockMVc
bean==>
@Setter
@Getter
@ToString
public class Book {
private Integer id;
private String name;
private String author;
}
controller==>
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(String name){
return "hello"+name;
}
@PostMapping("/book")
public Book addBook(@RequestBody Book book) {
return book;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JpaRestApplication.class)
//开启MockMvc自动配置
@AutoConfigureMockMvc
class JpaRestApplicationTests {
@Autowired
WebApplicationContext webApplicationContext;
@Autowired
MockMvc mockMvc;
// 每次只需test方法之前 初始化MockMvc
@Before
public void before() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
void test1() throws Exception {
MvcResult mvcResult = mockMvc.perform(
// get请求地址
MockMvcRequestBuilders.get("/hello")
//请求头类型
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
// 请求参数
.param("name", "lccc"))
// 期望的结果
.andExpect(MockMvcResultMatchers.status().isOk())
// 对结果的处理 打印
.andDo(MockMvcResultHandlers.print())
// 返回该对象
.andReturn();
// 从结果的响应 打印
System.out.println(mvcResult.getResponse().getContentAsString());
}
@Test
void test2() throws Exception {
Book book=new Book();
book.setId(1);
book.setAuthor("罗贯中");
book.setName("三国演义");
//对象转为字符串形式的json
String s = new ObjectMapper().writeValueAsString(book);
MvcResult mvcResult = mockMvc.perform(
//post请求
MockMvcRequestBuilders.post("/book")
// 设置请求头类型
.contentType(MediaType.APPLICATION_JSON)
// 内容
.content(s))
// 期望的目标
.andExpect(MockMvcResultMatchers.status().isOk())
// 返回结果
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
// 设置编码
response.setCharacterEncoding("UTF-8");
System.out.println(response.getContentAsString());
}
}
②使用RestTemplate
此方法不需要开启主程序
他默认帮我们启动了一个servlet为已定义的端口
@RunWith(SpringRunner.class)
//使用环境中确定的端口
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class TestTemplate {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void test() {
/**"/hello?name={1}" 请求的地址
* String.class 响应的类型
* "lcccc" 参数
*/
String lcccc = restTemplate.getForObject("/hello?name={1}", String.class, "lcccc");
System.out.println(lcccc);
}
}
3、json测试
......