NoteBook / Spring Boot基础(5)

  1. 使用spring-boot-devtools进行热部署
  2. 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(“孙悟空”));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值