MockMvc
@SpringBootTest(classes = {SpringbootApplication.class},webEnvironment = SpringBootTest.webEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcTestor{
@Resource
private MockMvc mockMvc ;
@Test
@DisplayName("文本响应测试用例")
public void testMock1() throws Exception{
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/logger"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.content().string("SUCCESS"))
.andReturn() ;
}
@Test
@DisplayName("JSON响应测试用例")
public void testMock2() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/getHeader")
.header("token","abcdw")
.param("id","772")
).andExpect(MockMvcResultMatchers.ststus().isOk())
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.jsonPath("access_token").value("abcdw"))
.andReturn()
}
}
public void getAllCategoryTest() throws Exception {
String responseString = mockMvc.perform(
get("/categories/getAllCategory")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("pcode","root")
).andExpect(status().isOk()
).andDo(print())
.andReturn().getResponse().getContentAsString();
System.out.println("--------返回的json = " + responseString);
}
1、注解
(1)@RunWith注解
- 指定测试运行器,例如使用 SpringJUnit4ClassRunner.class
(2)@ContextConfiguration注解
- 执行要加载的配置文件,例如 classpath:application.xml 或 file:src/main/resources/DispatcherServlet-servlet.xml
(3)@WebAppConfiguration注解
- 用于声明测试时所加载的是WebApplicationContext【WebMVC的 XmlWebApplicationContext 是其实现类】
⑷ WebApplicationContext
- WebMVC的IOC容器对象,需要声明并通过@Autowired自动装配进来
(5) 事务回滚
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
- 配置事务的回滚,对数据库的增删改都会回滚,便于测试用例的循环利用
- 为什么要事务回滚?
- 测试过程对数据库的操作,会产生脏数据,影响我们数据的正确性
- 不方便循环测试,即假如这次我们将一个记录删除了,下次就无法再进行这个Junit测试了,因为该记录已经删除,将会报错。
- 如果不使用事务回滚,我们需要在代码中显式的对我们的增删改数据库操作进行恢复,将多很多和测试无关的代码
2、核心方法
(1) perform
MocMvc.perform(get/post(接口).header("token",token).contentType(MediaType.APPLICATION_JSON).params("pcode","root"))
- perform(RequestBuilder requestBuilder ):执行一个RequestBuilder请,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions。
- get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object… urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
- header:带上头文件token
- contentType:数据类型。
- params:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式。
(2) ResultActions
- andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断)。
- andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断)。
- andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
(3)初始化MockMvc对象
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}