- 使用spring-boot-devtools进行热部署
- Spring Boot的单元测试
开发热部署可以在改变程序代码的时候,自动实现项目的重新启动和部署,大大提高了开发调试的效率
- 使用spring-boot-devtools进行热部署
工作原理:在发现代码有更改之后,自动重新启动应用,但是速度比手动停止后再启动要更快
使用2个ClassLoader,一个加载那些不会改变的类,另一个加载会更改的类,称为Restart ClassLoader
添加spring-boot-devtools的依赖配置,还需要加入spring-boot-maven-plugin
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 如果没有该项配置,devtools不会起作用,即应用不会restart -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
spring-boot-devtools也可以实现新增类、修改配置文件等的热部署
spring-boot-devtools还可以实现页面热部署,即页面修改后会立即生效,这个可以通过直接在application.properties文件中配置spring.thymeleaf.cache=false来实现
开发中如果出现了spring-boot-devtools不能实现热部署,一般可能是以下原因引起的:
(1)对应的spring-boot版本是否正确
(2)是否加入plugin以及属性<fork>true</fork>
(3)Eclipse project是否开启了Build Automatically自动编译的功能
(4)如果设置SpringApplication.setRegisterShutDownHook(false),则自动重启将不起作用
- Spring Boot的单元测试
官方推荐使用@SpringBootTest定义测试类
1、修改pom.xml文件,增加spring-boot-starter-test启动器,本启动器作为Spring Boot单元测试的核心配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2、配置基本属性
3、创建持久化类Student.java
4、定义数据访问层接口StudentRepository.java
5、定义业务层类SchoolService.java
6、定义控制器类StudentController.java及启动类App.class
7、Controller单元测试
Maven项目为单元测试专门定义了一个包:src/test/java,在src/test/java的org.fkit.springboottest包下新建一个类,命名为StudentControllerTest.java,在类上定义@RunWith(SpringRunner.class),让测试运行于Spring的测试环境,以及注解@SpringBootTest(classes=App.class),其中App.class是项目的启动类
@RunWith(SpringRunner.class)
@SpringBootTest(classes=App.class)
public class StudentControllerTest {
//注入Spring容器
@Autowired
private WebApplicationContext wac;
//MockMvc实现了对Http请求的模拟
private MockMvc mvc;
@Before
public void setupMockMvc(){
//初始化MockMvc对象
mvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
//新增学生 测试用例
@Test
……
mvc.perform(MockMvcRequestBuilders.post(“/student/save”)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(json.getBytes()) //传递json参数
)
.andExcept(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
……
}
用到的API进行解释分析:
mockMvc.perform:执行一个请求,请求可以调用到控制器中的某个方法
contentType(MediaType.APPLICATION_JSON_UTF8):代表发送端发送的数据格式是application/json;charset=UTF-8
ResultActions.andExcept:添加执行完成后的断言
ResultActions.andExcept(MockMvcResultMatchers.status().isOk()):查看请求的状态响应码是否为200,如果不是,则抛出异常,测试不通过
andExcept(MockMvcResultMatchers.jsonPath("$.name").value("孙悟空")):这里的jsonPath用来获取name字段,比对是否为孙悟空,不是就测试不通过
ResultActions.andDo:添加一个结果处理器,MockMvcResultHandlers.print()输出整个响应结果信息
8、Controller单元测试的执行
打开StudentControllerTest.java测试类,选中addStudent方法,单击鼠标右键,选择“Run As”-->“JUnit Test”命令
9、Service单元测试
在src/test/java的org.fkit.springboottest包下定义业务层测试类,命名为StudentServiceTest.java
Assert.assertThat(stu.getName(),CoreMatchers.is(“孙悟空”));