1. 首页
  2. IT资讯

单元测试不止 Junit

“u003Cpu003EJava后端,选择“”u003Cu002Fpu003Eu003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”单元测试不止 Junit” inline=”0″u003Eu003Cpu003E作者:AlanShelby(同公众号)u003Cu002Fpu003Eu003Cpu003Ehttps:u002Fu002Fzhuanlan.zhihuu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E.comu003Cu002Fiu003Eu002Fpu002F43260823u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E推荐阅读:u003Cu002Fstrongu003EIntelliJ IDEA 2019.3 这回真的要飞起来了u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E一、前言u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E在前面的章节我们介绍过 Junit 的使用,也了解过 spring-test,今天我们来了解一个新玩意 — mock 测试。这里仅仅做一个入门,对返回视图和返回 Json 数据的方法进行测试演示,不会把所有的方法都介绍到,具体文档详见链接:Mock Test,本章节主要讲解以下两部分内容:u003Cu002Fpu003Eu003Cpu003E1、Mock 测试简介u003Cu002Fpu003Eu003Cpu003E2、测试用例演示u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E二、Mock 测试简介u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E1、什么是 mock 测试u003Cu002Fpu003Eu003Cpu003E在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个u003Cstrongu003E虚拟的对象u003Cu002Fstrongu003E来创建以便测试的测试方法,就是u003Cstrongu003Emock 测试u003Cu002Fstrongu003E在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个u003Cstrongu003E虚拟的对象u003Cu002Fstrongu003E来创建以便测试的测试方法,就是* mock 测试*。u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E虚拟的对象就是 mock 对象。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Emock 对象就是真实对象在调试期间的代替品。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E2、为什么使用 mock 测试u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E避免开发模块之间的耦合u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E轻量、简单、灵活u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E3、MockMVC 介绍u003Cu002Fpu003Eu003Cpu003E基于 RESTful 风格的 SpringMVC 的测试,我们可以测试完整的 Spring MVC 流程,即从 URL 请求到控制器处理,再到视图渲染都可以测试。u003Cu002Fpu003Eu003Cpu003E1)MockMvcBuilderu003Cu002Fpu003Eu003Cpu003EMockMvcBuilder 是用来构造 MockMvc 的构造器,其主要有两个实现:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,对于我们来说直接使用u003Cstrongu003E静态工厂 MockMvcBuilders 创建u003Cu002Fstrongu003E即可。u003Cu002Fpu003Eu003Cpu003E2)MockMvcBuildersu003Cu002Fpu003Eu003Cpu003E负责创建 MockMvcBuilder 对象,有两种创建方式:u003Cu002Fpu003Eu003Cpu003EstandaloneSetup(Object… controllers):通过参数指定一组控制器,这样就不需要从上下文获取了。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003EwebAppContextSetupu003Cu002Fstrongu003E(WebApplicationContext wac):指定 WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的 MockMvc,本章节下面测试用例均使用这种方式创建 MockMvcBuilder 对象。u003Cemu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003E后获取更多优质文章u003Cu002Femu003Eu003Cu002Fpu003Eu003Cpu003E3)MockMvcu003Cu002Fpu003Eu003Cpu003E对于服务器端的 SpringMVC 测试支持主入口点。通过 MockMvcBuilder 构造 MockMvcBuilder 由 MockMvcBuilders 建造者的静态方法去建造。u003Cu002Fpu003Eu003Cpu003E核心方法:perform(RequestBuilder rb) — 执行一个 RequestBuilder 请求,会自动执行 SpringMVC 的流程并映射到相应的控制器执行处理,该方法的返回值是一个 ResultActions。u003Cu002Fpu003Eu003Cpu003E4)ResultActionsu003Cu002Fpu003Eu003Cpu003E(1)u003Cstrongu003EandExpectu003Cu002Fstrongu003E:添加 ResultMatcher 验证规则,验证控制器执行完成后结果是否正确;u003Cu002Fpu003Eu003Cpu003E(2)u003Cstrongu003EandDou003Cu002Fstrongu003E:添加 ResultHandler 结果处理器,比如调试时打印结果到控制台;u003Cu002Fpu003Eu003Cpu003E(3)u003Cstrongu003EandReturnu003Cu002Fstrongu003E:最后返回相应的u003Cstrongu003EMvcResultu003Cu002Fstrongu003E;然后进行自定义验证 u002F 进行下一步的异步处理;u003Cu002Fpu003Eu003Cpu003E5)MockMvcRequestBuildersu003Cu002Fpu003Eu003Cpu003E用来构建请求的,其主要有两个子类 u003Cstrongu003EMockHttpServletRequestBuilder *和u003Cu002Fstrongu003EMockMultipartHttpServletRequestBuilder*(如文件上传使用),即用来 Mock 客户端请求需要的所有数据。u003Cu002Fpu003Eu003Cpu003E6)MockMvcResultMatchersu003Cu002Fpu003Eu003Cpu003E(1)用来匹配执行完请求后的u003Cstrongu003E结果验证u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E(2)如果匹配失败将抛出相应的异常u003Cu002Fpu003Eu003Cpu003E(3)包含了很多验证 API 方法u003Cu002Fpu003Eu003Cpu003E7)MockMvcResultHandlersu003Cu002Fpu003Eu003Cpu003E(1)结果处理器,表示要对结果做点什么事情u003Cu002Fpu003Eu003Cpu003E(2)比如此处使用 MockMvcResultHandlers.print 输出整个响应结果信息u003Cu002Fpu003Eu003Cpu003E8)MvcResultu003Cu002Fpu003Eu003Cpu003E(1)单元测试执行结果,可以针对执行结果进行u003Cstrongu003E自定义验证逻辑u003Cu002Fstrongu003E。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E三、测试用例演示u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E1、添加依赖u003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<!– spring 单元测试组件包 –>u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<dependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<groupId>org.springframework<u002FgroupId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<artifactId>spring-test<u002FartifactId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<version>5.0.7.RELEASE<u002Fversion>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<!– 单元测试Junit –>u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<dependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<groupId>junit<u002FgroupId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<artifactId>junit<u002FartifactId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<version>4.12<u002Fversion>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<!– Mock测试使用的json-path依赖 –>u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<dependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<groupId>com.jayway.jsonpath<u002FgroupId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<artifactId>json-path<u002FartifactId>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<version>2.2.0<u002Fversion>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cpu003E前两个 jar 依赖我们都已经接触过了,对于返回视图方法的测试这两个 jar 依赖已经足够了,第三个 jar 依赖是用于处理返回 Json 数据方法的,这里要明白每个 jar 的具体作用。u003Cu002Fpu003Eu003Cpu003E2、被测试的方法u003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@RequestMappingu003Cu002Fstrongu003E(value =u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”editItem”u003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003EString editItem(Integer id, Model model) {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EItem item = itemService.getItemById(id);u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Emodel.au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eddu003Cu002Fiu003EAttribute(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”item”u003Cu002Fstrongu003E, item);u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Ereturnu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”itemEdit”u003Cu002Fstrongu003E;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@RequestMappingu003Cu002Fstrongu003E(value =u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”getItem”u003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@ResponseBodyu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003EItem getItem(Integer id) {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EItem item = itemService.getItemById(id);u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Ereturnu003Cu002Fstrongu003Eitem;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cpu003E这里我们提供了两个方法,一个是返回视图的方法,另一个是返回 Json 数据的方法,下面我们会给出测试类,分别对这两个方法进行测试。u003Cu002Fpu003Eu003Cpu003E3、测试类:ItemMockTestu003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@RunWithu003Cu002Fstrongu003E(SpringJUnit4ClassRunner.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eclassu003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@ContextConfigurationu003Cu002Fstrongu003E(locations =u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”classpath:springu002F*.xml”u003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@WebAppConfigurationu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eclassu003Cu002Fstrongu003EItemMockTest {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@Autowiredu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eprivateu003Cu002Fstrongu003EWebApplicationContext context;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eprivateu003Cu002Fstrongu003EMockMvc mockMvc;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@Beforeu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Evoidu003Cu002Fstrongu003Einit {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EmockMvc = MockMvcBuilders.webAppContextSetup(context).build;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cpu003E这里前两个注解就不再解释了,我们在学习 Spring 与 Junit 整合的时候已经讲解过了,这里说一下第三个注解:@WebAppConfiguration:可以在单元测试的时候,不用启动 Servlet 容器,就可以获取一个 Web 应用上下文。u003Cemu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003E后获取更多优质文章u003Cu002Femu003Eu003Cu002Fpu003Eu003Cpu003E1)返回视图方法测试u003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@Testu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Evoidu003Cu002Fstrongu003Etestu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Ethrowsu003Cu002Fstrongu003EException {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EMvcResult result = mockMvc.perform(MockMvcRequestBuilders.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Egetu003Cu002Fstrongu003E(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”u002FeditItem”u003Cu002Fstrongu003E).param(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”id”u003Cu002Fstrongu003E,u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”1″u003Cu002Fstrongu003E))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.view.name(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”itemEdit”u003Cu002Fstrongu003E))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.status.isOk)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andDo(MockMvcResultHandlers.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eprintu003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andReturn;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EAssert.assertNot(result.getModelAndView.getModel.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Egetu003Cu002Fstrongu003E(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”item”u003Cu002Fstrongu003E));u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRcy0xKZIxrbKLv” img_width=”1080″ img_height=”576″ alt=”单元测试不止 Junit” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcy0xKw7GzQJyl” img_width=”498″ img_height=”81″ alt=”单元测试不止 Junit” inline=”0″u003Eu003Cpu003E这三句代码是我们对结果的期望,最后打印出了结果,说明执行成功,所有期望都达到了,否则会直接报错。从结果中我们就可以看到这个请求测试的情况。u003Cu002Fpu003Eu003Cpu003E2、返回 Json 数据方法u003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E@Testu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Evoidu003Cu002Fstrongu003Etest1u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Ethrowsu003Cu002Fstrongu003EException {u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003EmockMvc.perform(MockMvcRequestBuilders.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Egetu003Cu002Fstrongu003E(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”u002FgetItem”u003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.param(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”id”u003Cu002Fstrongu003E,u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”1″u003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.accept(MediaType.APPLICATION_JSON))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.status.isOk)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.content.contentTypeCompatibleWith(MediaType.APPLICATION_JSON))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.jsonPath(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”$.id”u003Cu002Fstrongu003E).value(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E1u003Cu002Fstrongu003E))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andExpect(MockMvcResultMatchers.jsonPath(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”$.name”u003Cu002Fstrongu003E).value(u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E”IPhone X”u003Cu002Fstrongu003E))u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andDo(MockMvcResultHandlers.u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eprintu003Cu002Fstrongu003E)u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E.andReturn;u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRcy0xLGEcDC3i3″ img_width=”1080″ img_height=”471″ alt=”单元测试不止 Junit” inline=”0″u003Eu003Cpu003E在这个方法中比较特殊的就是设置 MediaType 类型,因为都是使用 Json 格式,所以设置了 MediaType.APPLICATION_JSON,jsonPath 用于比对期望的数据是否与返回的结果一致,这里需要注意的是 “$.id” 这 key 的种形式。u003Cemu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E微信u003Cu002Fiu003E搜索 web_resource u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003E后获取更多优质文章u003Cu002Femu003Eu003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Eu003Cstrongu003E四、小结u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cbru003Eu003Cu002Fblockquoteu003Eu003Cpu003E这里只是用到了 MockMvc 很小一部分知识,更加深入学习会使你养成一种良好编写单元测试的习惯,这是十分难得的一种好习惯,推荐去看官方文档,然后动手去测试一下,为你编写的每一个 Controller 方法进行测试,保证他们的可靠性。u003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cu002Fdivu003Eu003Cdivu003Eu003Cu002Fdivu003Eu003Cdivu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003E”

原文始发于:单元测试不止 Junit

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/18044.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code