当前位置: 首页 > news >正文

junit mockito Base基类

编写单元测试时我们都习惯性减少重复代码

以下基于spring mvc框架,需要手动pom导包

BaseTest类用于启动上下文进行debug调试

MockBaseTset类用于不启动上下文进行打桩mock

pom.xml

      <dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito</artifactId><version>1.6.1</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>1.6.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version> 4.2.5.RELEASE</version><scope>test</scope><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>

BaseTest.java

import com.thinkive.gateway.v2.result.Result;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;import java.util.HashMap;
import java.util.Map;/*** @description: 单元测试基类*/@RunWith(SpringJUnit4ClassRunner.class)
//解决@Slf4j报错
@PowerMockIgnore({"javax.script.*","javax.management.*"}) 
@ContextConfiguration({"classpath*:dubbo_cfg/*.xml", "classpath*:spring-cfg.xml"})
//不用启动 Servlet 容器,就可以获取一个 Web 应用上下文
@WebAppConfiguration  
public class BaseTest extends Mockito{private static final ObjectMapper MAPPER = new ObjectMapper();protected Map<String,String> params = new HashMap<>();protected Map<String,String> headers = new HashMap<>();protected  MockMvc mockMvc;protected String prefix;/*** POST请求* @param url* @throws Exception*/protected JsonResult postHttp(String url) throws Exception {MultiValueMap<String, String> multiValueParamMap = new LinkedMultiValueMap<>();if (params.size() > 0) {multiValueParamMap.setAll(params);}HttpHeaders httpHeaders = new HttpHeaders();if (headers.size() > 0) {for (String key : headers.keySet()) {httpHeaders.set(key, headers.get(key));}}params.clear();MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(prefix + url).params(multiValueParamMap).headers(httpHeaders)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();mvcResult.getResponse().setCharacterEncoding("UTF-8");mvcResult.getResponse().setContentType("application/json;charset=UTF-8");String result = mvcResult.getResponse().getContentAsString();return MAPPER.readValue(result, JsonResult.class);}/*** GET请求* @param url url后缀* @return JsonResult* @throws Exception*/protected JsonResult getHttp(String url) throws Exception {MultiValueMap<String, String> multiValueParamMap = new LinkedMultiValueMap<>();if (params.size() > 0) {multiValueParamMap.setAll(params);}HttpHeaders httpHeaders = new HttpHeaders();if (headers.size() > 0) {for (String key : headers.keySet()) {httpHeaders.set(key, headers.get(key));}}MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get(prefix + url).params(multiValueParamMap).headers(httpHeaders)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();mvcResult.getResponse().setCharacterEncoding("UTF-8");mvcResult.getResponse().setContentType("application/json;charset=UTF-8");String result = mvcResult.getResponse().getContentAsString();return MAPPER.readValue(result, JsonResult.class);}}

MockBaseTest.java

@RunWith(MockitoJUnitRunner.class)
@ActiveProfiles("dev")
@PowerMockIgnore("javax.management.*")
public class MockBaseTest extends BaseTest{}

示例:

public class CustControllerTest extends MockBaseTest {@InjectMocks //用于创建一个实例,调用真实的方法private CustController custController;@Mockprivate CustService custService;@Beforepublic void init(){this.prefix = "/api/cust";//MockitoAnnotations.initMocks(this);//初始化MVCthis.mockMvc = MockMvcBuilders.standaloneSetup(custController).build();}@Testpublic void testInfoList() throws Exception{CustInfo custInfo = new CustInfo();custInfo.setIdNo("4304221955xxxxxxxx");when(custService.findCustInfo(anyLong())).thenReturn(custInfo);//添加请求参数params.put("id","1");//发送post请求JsonResult jsonResult = postHttp("/info");String idNo = (List<Map>)((Map)jsonResult.get("info")).get("idNo");Assert.assertNotNull(idNo);Assert.assertEquals(custInfo.getIdNo(),idNo);}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数学建模学习(112):FAHP模糊层次分析法
  • <数据集>水果识别数据集<目标检测>
  • 【Linux】HTTP 协议
  • <数据集>AffectNet表情识别数据集<目标检测>
  • 【快速逆向二/无过程/有源码】掌上高考—2024高考志愿填报服务平台
  • 神经网络处理器模拟器的一点思考
  • 使用 PowerShell 自动化图像识别与鼠标操作
  • 四、GD32 MCU 常见外设介绍 (4) EXTI 中断介绍
  • ip地址是电脑还是网线决定的
  • Potree在web端显示大型点云模型文件
  • MySQL_JDBC
  • 【git】切换到远程其他分支
  • Flask 框架 redirect() url_for()
  • python键盘操作工具:ctypes、pyautogui
  • Ajax学习笔记
  • [deviceone开发]-do_Webview的基本示例
  • __proto__ 和 prototype的关系
  • Java反射-动态类加载和重新加载
  • npx命令介绍
  • PHP那些事儿
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 计算机在识别图像时“看到”了什么?
  • 前端设计模式
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !$boo在php中什么意思,php前戏
  • # Java NIO(一)FileChannel
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (C语言)fgets与fputs函数详解
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)linux使用docker容器运行mysql
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)php新闻发布平台 毕业设计 141646
  • (一)Docker基本介绍
  • (一)插入排序
  • (原)本想说脏话,奈何已放下
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)项目管理杂谈-我所期望的新人
  • (转载)hibernate缓存
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *** 2003
  • .Net Core 中间件验签
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET开源项目介绍及资源推荐:数据持久层
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
  • [000-01-030].Zookeeper学习大纲
  • [100天算法】-不同路径 III(day 73)
  • [1127]图形打印 sdutOJ
  • [20180224]expdp query 写法问题.txt
  • [AI Embedchain] 开始使用 - 全栈
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大