zoukankan      html  css  js  c++  java
  • SpringBoot中的测试(test)

    SpringBoot2.2之后用的Junit5,所以在这里使用的Junit5。Spring Boot会默认帮我们导入包,所以不用添加依赖了。

    注解:

    @BeforeAll : 只执行一次,执行时机是在所有测试和 @BeforeEach 注解方法之前。
    @BeforeEach:在每个测试执行之前执行。
    @AfterEach :在每个测试执行之后执行。
    @AfterAll: 只执行一次,执行时机是在所有测试和 @AfterEach 注解方法之后。

    测试一下,代码如下

    package com.example.demo;
    
    import org.junit.jupiter.api.*;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.web.servlet.MockMvc;
    
    @SpringBootTest
    class DemoApplicationTests {
       private MockMvc mockMvc;
    
       @BeforeAll
       public static void  beforeAll(){
           System.out.println("begin All");
       }
    
       @BeforeEach
        public void beforeEach(){
           System.out.println("begin Each");
       }
    
       @Test
        public void test1(){
           System.out.println("test1");
       }
    
        @Test
        public void test2(){
            System.out.println("test2");
        }
    
        @AfterEach
        public void afterEach(){
            System.out.println("end Each");
        }
    
        @AfterAll
        public static void afterAll(){
            System.out.println("end All");
        }
    
    }

    最终的输出结果为:

    begin All
    begin Each
    test1
    end Each
    begin Each
    test2
    end Each
    end All

    assert(断言)。一般的断言,无非是检查一个实例的属性(比如,判空与判非空等),或者对两个实例进行比较(比如,检查两个实例对象是否相等)等

    • assertEquals(A,B,"message"),判断A对象和B对象是否相等,这个判断在比较两个对象时调用了equals()方法。

    • assertSame(A,B,"message"),判断A对象与B对象是否相同,使用的是==操作符。

    • assertTrue(A,"message"),判断A条件是否为真。

    • assertFalse(A,"message"),判断A条件是否不为真。

    • assertNotNull(A,"message"),判断A对象是否不为null

    • assertArrayEquals(A,B,"message"),判断A数组与B数组是否相等

    MockMvc。对Controller的测试需要用到MockMvc技术

    首先初始化MockMvc

    private MockMvc mockMvc;
    
    @Autowired
    private WebApplicationContext wac;
    
    @Before
    public void setupMockMvc(){
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    然后使用mockMvc模拟请求

    模拟get请求带参数

    mockMvc.perform(MockMvcRequestBuilders.get("/hello?name={name}","zeng"));

    模拟post请求

    mockMvc.perform(MockMvcRequestBuilders.post("/user").param("name", "zhang")) //执行传递参数的POST请求(也可以post("/user?name=zhang"))  

    模拟文件上传

    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/fileupload").file("file", "文件内容".getBytes("utf-8")));

    也可以直接使用MultiValueMap构建参数

    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
    params.add("name", "zeng");
    params.add("password", "123");
    params.add("id", "1");
    mockMvc.perform(MockMvcRequestBuilders.get("/stu").params(params));

    模拟session和cookie

    mockMvc.perform(MockMvcRequestBuilders.get("/index").sessionAttr(name, value));
    mockMvc.perform(MockMvcRequestBuilders.get("/index").cookie(new Cookie(name, value)));

    模拟HTTP请求头:

    mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1).header(name, values));

    设置请求的Content-Type:

    mockMvc.perform(MockMvcRequestBuilders.get("/index").contentType(MediaType.APPLICATION_JSON_UTF8));

    设置返回格式为JSON:

    mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1).accept(MediaType.APPLICATION_JSON));

    mockMvc处理返回结果

    期望成功调用,即HTTP Status为200:

    mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
        .andExpect(MockMvcResultMatchers.status().isOk());

    期望返回内容是application/json

    mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
        .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON));

    检查返回JSON数据中某个值的内容:

    mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
        .andExpect(MockMvcResultMatchers.jsonPath("$.name").value("zzz"))

    这里使用到了jsonPath$代表了JSON的根节点.

    比较返回内容,使用content()

    // 返回内容为hello
    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andExpect(MockMvcResultMatchers.content().string("hello"));
    
    // 返回内容是XML,并且与xmlCotent一样
    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andExpect(MockMvcResultMatchers.content().xml(xmlContent));
    
    // 返回内容是JSON ,并且与jsonContent一样
    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andExpect(MockMvcResultMatchers.content().json(jsonContent));

    比较forward或者redirect:

    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andExpect(MockMvcResultMatchers.forwardedUrl("index.html"));
    // 或者
    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andExpect(MockMvcResultMatchers.redirectedUrl("index.html"));

    输出响应结果:

    mockMvc.perform(MockMvcRequestBuilders.get("/index"))
        .andDo(MockMvcResultHandlers.print());
    

    在测试过程中如果要对数据库添加、删除、修改数据可以使用@Transactional,使数据能够回滚。

     

  • 相关阅读:
    JavaScript Basic Memo
    移动端WEB开发备忘录
    重学前端
    roadhog 构建优化
    ES6 memo
    styled-components 背后的魔法
    怎么在多场景下使用不同的 git 账号 commit
    三方登录总结
    Promise 错误处理
    观察者模式 vs 发布-订阅模式
  • 原文地址:https://www.cnblogs.com/minblog/p/12521093.html
Copyright © 2011-2022 走看看