使用MockMvc进行Junit单元测试(自己的学习笔记)

一、为何使用MockMvc?

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立
http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络
环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以
使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而
且很方便。

二、测试逻辑

  1. MockMvcBuilder构造MockMvc的构造器
  2. mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑
  3. perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式
  4. 使用StatusResultMatchers对请求结果进行验证
  5. 使用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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值