使用MockMvc进行Junit单元测试
一、为何使用MockMvc?
对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立
http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络
环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以
使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而
且很方便。
二、测试逻辑
- MockMvcBuilder构造MockMvc的构造器
- mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑
- perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式
- 使用StatusResultMatchers对请求结果进行验证
- 使用ContentResultMatchers对请求返回的内容进行验证
三、具体代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/applicationContext-*xml"})
//配置事务的回滚,对数据库的增删改都会回滚,便于测试用例的循环利用
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
@WebAppConfiguration
public class Test {
//记得配置log4j.properties ,的命令行输出水平是debug
protected Log logger= LogFactory.getLog(TestBase.class);
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext wac;
@Before() //这个方法在每个方法执行之前都会执行一遍
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象
}
@org.junit.Test
public void getAllCategoryTest() throws Exception {
String responseString = mockMvc.perform(
get("/categories/getAllCategory") //请求的url,请求的方法是get
.contentType(MediaType.APPLICATION_FORM_URLENCODED) //数据的格式
.param("pcode","root") //添加参数
).andExpect(status().isOk()) //返回的状态是200
.andDo(print()) //打印出请求和相应的内容
.andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串
System.out.println("--------返回的json = " + responseString);
}
}
方法解析
- **perform:**执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
- **get:**声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, **Object…
urlVariables):**根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。 - **param:**添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式,可见后面被@ResponseBody注解参数的解决方法
**andExpect:**添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断); - **andDo:**添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
- **andReturn:**最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断)。
使用mockmc来测试,mockmvc主要是模拟页面对后台的访问
controller层单元测试的参数传递
GET:
1.路径参数@PathVariable
2.表单参数@RequestParam
POST:
1.JSON请求体参数
@RequestBody
放:
1.路径参数@PathVariable
2.表单参数@RequestParam
删除:
1.路径参数@PathVariable
2.表单参数@RequestParam
MockMvc:
1.路径请求
mockMvc.perform(MockMvcRequestBuilders
.请求方式(“url / {path}”,参数值)
2.表单请求
mockMvc.perform(MockMvcRequestBuilders
.请求方式(“url”).param(“键”,“值”).contentType(MediaType.APPLICATION_FORM_URLENCODED)
3.JSON请求
MvcResult mvcResult= mvc.perform(
MockMvcRequestBuilders.post(“http://127.0.0.1:8080/index”).
content(jsonObject.toString()).
contentType(MediaType.APPLICATION_JSON)
).
andExpect(MockMvcResultMatchers.status().isOk()).
andDo(MockMvcResultHandlers.print()).
andReturn();
)
使用查询
SELECT * FROM A WHERE E_ID=NULL
查询不到E_ID为空的数据
改为SELECT * FROM A WHERE E_ID is NULL查询正常!
为什么?
------解决方案--------------------
null不能比较
只能是is null is not null