SpringBoot开发者工具及单元测试

Lou.Chen
大约 3 分钟

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测试

......