• 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,使数据能够回滚。

     

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/minblog/p/12521093.html
Copyright © 2020-2023  润新知