SpringBoot + Junit5 + MockMvc 写单元测试
1.1 junit5 版本5.6.0 pom文件如下:
<properties> <junit.jupiter.version>5.6.0</junit.jupiter.version> </properties> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency>
1.2 test 测试类里面 首先先构建mockMvc的环境
@SpringBootTest @ExtendWith(SpringExtension.class) //导入Spring测试框架 @DisplayName("人员ctr测试") public class PersonControllerTest { @Autowired private PersonController personController ; private MockMvc mockMvc; @BeforeEach public void setUp() { MockitoAnnotations.initMocks(this);//这句话执行以后,service自动注入到controller中。 // (1)构建mvc环境 mockMvc = MockMvcBuilders.standaloneSetup((personController)).build(); }
}
1.3 开始编写测试方法
1.2.1 Junit5最大的变化就是可以传参 ,简单介绍一下用法
@ValueSource(strings = {"111","222"}) //多个参数执行多次(即id为111执行一次后还会执行id为222) ,参数为字符串类型 public void test(String id){}
@MethodSource("getPerson") //参数为方法,方法里面你可以写你想要的数据格式 ,比如getPerson返回的JSONObject格式 public void test(JSONObject jsonobject){}
@ParameterizedTest //需要传参数时需要使用, 跟上面的注解是配套用的
1.2.2 MockMvc的使用:模拟对象去调用,真正实现单元测试
1. mockMvc.perform(MockMvcRequestBuilders.get("/v1/user/get_info") //请求构建mvc环境时的controller层里面的地址 , 可以get、post、put请求
2. .contentType(MediaType.APPLICATION_FORM_URLENCODED) //设置内容格式 ,当为post请求时要使用 .accept()设置接收格式,和内容的格式一样
3. post传参使用 .content(JSONObject.toJSONString(personIds))//设置内容
@Test @DisplayName("根据id_获取人员信息") @Order(1) //顺序 // @MethodSource("getPerson") //参数为方法 @ValueSource(strings = {"111","222"}) //多个参数执行多次 @ParameterizedTest //需要传参数时使用 public void getPersonById(String id) throws Exception { MockHttpServletResponse response = mockMvc.perform(MockMvcRequestBuilders.get("/v1/person/get_info") .contentType(MediaType.APPLICATION_FORM_URLENCODED) //设置内容格式 .param("personid",id)//设置内容 ) .andDo(MockMvcResultHandlers.print())//返回打印结果 .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn().getResponse(); response.setCharacterEncoding("UTF-8"); //解决中文乱码问题 Result<PersonDTO> result = JSONObject.parseObject(response.getContentAsString(), Result.class);//反序列化成对象 Assertions.assertTrue(result.getDataStore() != null); //断言结果校验 }
1.4 测试成功