spring-boot-starter-test

排除Junit4

springboot2.2.x以下的版本,只包含junit4.x的版本

<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.4.RELEASEversion>
        <relativePath/>
    parent>

引入test

 <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-testartifactId>
      <scope>testscope>
dependency>

 

引入2.2.x以上的springboot则包含Junit4.x和Junit5.x两个版本

<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.2.RELEASEversion>
        <relativePath/>
    parent>

spring-boot-starter-test_第1张图片

使用springboot-test时查看使用的版本中是否同时包含两个版本,如果都包含则可以排除Junit4

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>

MockMvc测试接口

编写一个get接口,调用了service层,无需启动服务器

    @Autowired
    private TestService testService;
 
    @GetMapping(value = "/test1")
    public String test1() {
        testService.test1();
        return "success";
    }
public void test1(){}//service

测试get请求 @SpringBootTest 会根据路径寻找 @SpringBootApplication 或 @SpringBootConfiguration所以请保持test目录结构与main目录结构相同。否则要

使用@SpringBootTest(classes="Application.class")主动标记启动类。

@SpringBootTest
@AutoConfigureMockMvc
public class TestController {
    @Autowired
    private MockMvc mvc;
    @Test
    public void test1() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/test1")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("success"));
    }
}

@MockBean模拟bean

编写一个get接口,调用了service层,在service返回字符串service1

    @Autowired
    private TestService testService;
    @GetMapping(value = "test")
    public String test() {
        return testService.service1();
    }
public String service1(){
        return "service1";
    }

通过@MockBean注入TestService。使用BDDMockito.given()给service1()重新搞一个返回值。这个请求返回的是mockvalue而不是service1。事实上将service类上

的@Service注解去掉,即没有这个业务bean这个测试类也会成功运行。

 @MockBean
    private TestService remoteService;
@Test
    public void test2() throws Exception {
        given(this.remoteService.service1()).willReturn("mockvalue");
        String contentAsString = mockMvc.perform(MockMvcRequestBuilders.get("/test"))
                .andReturn().getResponse().getContentAsString();
        System.out.println("!!!!!!!!!!!!!!!!"+contentAsString);
    }

@JsonTest测试JSON

JacksonTester的功能和JSONObject类似。

public class VehicleDetails {
    private String make;
    private String model;
    public String getMake() {
        return make;
    }
    public void setMake(String make) {
        this.make = make;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
}
View Code
@JsonTest
public class TestController2 {
    @Autowired
    private JacksonTester<VehicleDetails> json;

    @Test
    void testDeserialize() throws Exception {
        String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
        VehicleDetails vehicleDetails = this.json.parseObject(content);
        System.out.println(vehicleDetails.getMake()+""+vehicleDetails.getModel());
    }

addReturn()

设置MediaType,设置Head.addReturn()返回请求结果.

@SpringBootTest
@AutoConfigureMockMvc
public class TestController {
    @Autowired
    MockMvc mvc;
    @Test
    public void test2()throws Exception{
        Person p = new Person();
        p.setName("张三");
        p.setAge(11);
        MockHttpServletResponse response = mvc.perform(MockMvcRequestBuilders.post("/test2").contentType(MediaType.APPLICATION_JSON)
                .content(JSONObject.toJSONString(p)).header("test-head", "head-value")).andReturn().getResponse();
        String contentAsString = response.getContentAsString(Charset.forName("utf-8"));
        System.out.println(response.getHeader("test2-head"));
        System.out.println(contentAsString);
    }
}
@PostMapping(value = "test2")
    public Person test2(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response) {
        System.out.println("!!!!!!!!!!!!!"+person);
        System.out.println("!!!!!!!!!!!!!"+request.getHeader("test-head"));
        response.addHeader("test2-head","headvalue");
        return testService.testService(person);
    }

 

 

andDo()

好像只能打印请求

@SpringBootTest
@AutoConfigureMockMvc
public class TestController {
    @Autowired
    MockMvc mvc;
    @Test
    public void test3() throws Exception {
        Person p = new Person();
        p.setName("张三");
        p.setAge(11);
        ResultActions actions = mvc.perform(MockMvcRequestBuilders.post("/test2")
                .contentType(MediaType.APPLICATION_JSON).content(JSONObject.toJSONString(p)));
        actions.andReturn().getResponse().setCharacterEncoding("utf-8");
        actions.andDo(MockMvcResultHandlers.print());
    }
}
MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /test2
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
             Body = {"age":11,"name":"张三"}
    Session Attrs = {}

Handler:
             Type = com.datang.qqboark.controller.DemoController
           Method = com.datang.qqboark.controller.DemoController#test2(Person, HttpServletRequest, HttpServletResponse)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [test2-head:"headvalue", Content-Type:"application/json;charset=utf-8"]
     Content type = application/json
             Body = {"name":"张三","age":11}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

andExpect()

增加断言MockMvcResultMatchers断言HTTP状态,断言head,断言返回值.

@SpringBootTest
@AutoConfigureMockMvc
public class TestController {
    @Autowired
    MockMvc mvc;
    @Test
    public void test4() throws Exception {
        Person p = new Person();
        p.setName("张三");
        p.setAge(11);
        ResultActions actions = mvc.perform(MockMvcRequestBuilders.post("/test2")
                .contentType(MediaType.APPLICATION_JSON).content(JSONObject.toJSONString(p)));
        actions.andReturn().getResponse().setCharacterEncoding("utf-8");
        actions.andExpect(MockMvcResultMatchers.status().isOk());
        actions.andExpect(MockMvcResultMatchers.status().is2xxSuccessful());
        actions.andExpect(MockMvcResultMatchers.header().string("test2-head","headvalue"));
        actions.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON));
        actions.andExpect(MockMvcResultMatchers.content().json(JSONObject.toJSONString(p)));
    }
}

 

你可能感兴趣的:(spring-boot-starter-test)