1 Mock的优缺点分析

1.1 Mock的好处

一、由于其他系统模块出错引起本模块的测试错误,我们可以采用mock隔离,避免干预;
二、开发过程中,只要交互双方定义好接口,团队之间可以并行工作,进程互不影响;
三、依赖系统无法响应,或者响应异常时,可以用mock Object代替,快速反应,不会影响测试进度;
四、提前接入测试,提供测试效率,当接口定义好后,测试人员就可以创建Mock,把接口添加到自动化测试环境,提前开始测试,起到测试驱动开发效果;
五、可以有效的增加覆盖,接口涉及入参,或者业务逻辑复杂的情况,某些场景无法通过正常手段进行操作,可以通过mock虚拟模拟;

1.2 使用Mock 可能存在的风险

一、测试过程中如果大量使用Mock,mock测试的场景失去了真是性,可能会导致在后续的系统性测试时才发现bug,使得缺陷发现的较晚,可能会造成后续修复成本更大;

1.3 为什么使用powerMock

一、PowerMock能够完美的mock静态、final、私有方法等,而其它mock工具是不能完美兼容的。

1.4 为什么要使用H2

一、单测的过程中涉及到大量的数据库操作时,使用H2可以最大限度的保证测试的真实性。

2. 相关依赖

mockito jar引入

 <properties><mockito.version>2.26.0</mockito.version><powermock.version>2.0.7</powermock.version></properties>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>powermock jar引入<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>

Mock时修改私有变量的属性

<dependency>
<groupId>springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>1.2.6</version>
</dependency>

jakarta的依赖

<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>

3.代码示例和说明

3.1 powerMock 配置

import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)
public class BaseTest2 {// 初始化
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
}

3.2 业务代码Mock

import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;/声明需要mock的静态方法所在类
@PrepareForTest({PojoUtils.class, UUID.class})
//忽略类 有些代码不影响代码逻辑但是会导致mock报错,直接忽略掉就可以了
@PowerMockIgnore({"io.fabric8.kubernetes.*"})
public class OperatorServiceImplTest extends BaseTest2 {//Mock 对象
@InjectMocks
private OperatorService operatorService = new OperatorServiceImpl();//Mock 对象成员变量
@Mock
private EksConfig eksConfig;@Mock
private JobClientService clientService;@Mock
private MinglveDQCService qualityService;@Mock
private EksService eksService;@Mock
private EngineService engineService;@Mock
private TaskService taskService;@Mock
private TaskWorkspaceMapper taskWorkspaceMapper;@Mock
private EksUtils eksUtils;@Mock
private CosUtils cosUtils;@Before
public void init(){
//修改私有成员变量的值
ReflectionTestUtils.setField(operatorService, "configUrlPrefix",
"wedata-agent-1257305158.cos.ap-beijing.myqcloud.com");VisiableThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
//核心线程数目
executor.setCorePoolSize(20);
//指定最大线程数a
executor.setMaxPoolSize(64);
//队列中最大的数目
executor.setQueueCapacity(10000);
//线程名称前缀
executor.setThreadNamePrefix("defaultThreadPool_");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后的最大存活时间
executor.setKeepAliveSeconds(10);
//加载
executor.initialize();
//修改私有成员变量的值
ReflectionTestUtils.setField(operatorService, "executor",
executor);//Mock 静态方法
PowerMockito.mockStatic(PojoUtils.class, UUID.class);//Mock 静态方法的返回
KubeConf kubeConf = new KubeConf();
kubeConf.setCaCert("abc");
kubeConf.setClusterId("123");
kubeConf.setClusterName("abc");
kubeConf.setHost("122.0.0.1");
kubeConf.setPort(8080);
kubeConf.setRequestSchema("abc");
kubeConf.setToken("abc");
PowerMockito.when(PojoUtils.getFromEksInfo(Mockito.any())).thenReturn(kubeConf);final String id = "493410b3-dd0b-4b78-97bf-289f50f6e74f";
UUID uuid = UUID.fromString(id);
PowerMockito.when(UUID.randomUUID()).thenReturn(uuid);}@Test
public void dispatcher() {
TaskWorkspaceInstance instance = new TaskWorkspaceInstance();//Mock 实例方法
Mockito.when(taskWorkspaceMapper
.getOneWorkspaceByState(Mockito.anyInt(), Mockito.anyInt()))//与参数列表保持一致
.thenReturn(instance);//循环调用时支持返回一个集合
JobClientInstance jobClientInstance = new JobClientInstance();
jobClientInstance.setState(1);
List<JobClientInstance> clientInfos = Lists.newArrayList(jobClientInstance);Mockito.when(clientService
.findAllScrap(Mockito.any(), Mockito.any())).thenReturn(clientInfos);EKSInstance eksInfo = new EKSInstance();
Mockito.when(eksService
.FindByClusterId(Mockito.any(), Mockito.any())).thenReturn(eksInfo);
operatorService.dispatcher();
}}

powermock mock 局部变量

//FileOperations 在QualityTaskQueryServiceImpl类中被调用的
@PrepareForTest({QualityTaskQueryServiceImpl.class})
public class QualityTaskQueryServiceImplTest extends BaseTest1 {   @Testpublic void trialRun1() {TrialTaskReq trialTask = new TrialTaskReq();trialTask.setExprId(1);trialTask.setScheduleTime("2021-09-14 00:00:00");trialTask.setExpression("nopartition");PowerMockito.when(HttpUtils.executePostWithJson(Mockito.any(), Mockito.any())).then((Answer<String>) invocation -> "{\"message\":\"123\",\"code\":\"SUCCESS\"}");//mock 局部变量FileOperations fileOperations = PowerMockito.mock(FileOperations.class);try {PowerMockito.whenNew(FileOperations.class).withAnyArguments().thenReturn(fileOperations);PowerMockito.doNothing().when(fileOperations).upload(Mockito.anyString(), Mockito.anyString(), Mockito.anyString());} catch (Exception e) {e.printStackTrace();}qualityTaskQueryService.trialRun(trialTask);}
}

powerMock单元测试相关推荐

  1. java jacoco powerMock 单元测试覆盖率为0怎么解决

    我们项目中使用powerMock作为单元测试的mock工具,统计项目测试覆盖率使用jacoco编译的结果上传到sonar,但是jacoco 和 powerMock在运行时runtime加载代码的时候自 ...

  2. 玩转Spring JUnit+mockito+powermock单元测试(使用详解)

    说明:请耐心看完... Spring中执行单元测试,最麻烦的就是解决Bean的定义以及注入的问题.最开始使用Spring的上下文初始化进行测试,开头是这样的: @RunWith(SpringJUnit ...

  3. Effective Java 在工作中的应用总结

    简介: <Effective Java>是一本经典的 Java 学习宝典,值得每位 Java 开发者阅读.笔者将书中和平日工作较密切的知识点做了部分总结. 作者 | 宜秋 来源 | 阿里技 ...

  4. Java编程技巧之单元测试用例编写流程

    简介: 立足于"如何来编写单元测试用例",让大家"有章可循",快速编写出单元测试用例. 作者 | 常意 来源 | 阿里技术公众号 温馨提示:本文较长,同学们可收 ...

  5. 其他service 单例 工具类_获取不到,虚拟来凑?这个工具不得不学!

    在真实的测试当中,并不是所有的逻辑都可以自己控制,因此有了Mock测试.今天就结合场景来讲一下怎么做Mock测试. 适合对象:初次尝试集成和使用Mockito进行单元测试的开发同学. Mock框架的集 ...

  6. 万字长文带你彻底搞懂DevOps

    DevOps 日渐成为研发人员耳熟能详的一个组合词,但什么是 DevOps,为什么 DevOps 对于互联网企业如此重要,真正将其思考透彻的人却不多,带着这些困惑,本文将带你一探 DevOps 的起源 ...

  7. 详解~前端人需要了解的DevOps

    点击上方关注 前端技术江湖,一起学习,天天进步 你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. DevOps 日渐成为研发人员耳熟能详的一个组合词,但什么是 D ...

  8. dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)

    转:http://blog.csdn.net/yys79/article/details/66472797 最近,项目中频繁用到dubbo,而且java工程用引用了几十个关联系统的服务(如用户认证,基 ...

  9. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

最新文章

  1. hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
  2. vector 不是模板
  3. Android 应用交互框架浅析
  4. 此计算机必须为委派而被信任_如何增强 ClassLoader 双亲委派模式 ?
  5. centos 多个mysql数据库_CentOS6.5 一台服务器同时安装多个Mysql数据库
  6. Tensorflow添加matplotlib可视化
  7. oauth样例项目【01】之 使用auth-code进行认证授权
  8. 通过编译TPC-DS生成测试数据并发送到benchmark进行查询测试
  9. BlackBerry7290软件安装——电子书阅读Mobipocket
  10. 基于Servlet和jsp的小说网站系统
  11. 音高和频率转换(转载)
  12. 计算机专业保研面试备考:线性代数
  13. 印象笔记 HTML邮件,如何通过私有邮箱保存邮件到印象笔记?
  14. 洛谷 P1162填图颜色
  15. 禅与摩托车维修艺术 摘选
  16. spark常见面试题
  17. BOOL和Boolean的区别
  18. 5GNR漫谈8:CSI-RS/TRS/SRS参考信号
  19. ROS基础篇(二)-- 基础知识
  20. 第 02 篇 在 SQL 的世界里一切都是关系

热门文章

  1. Python模块卸载
  2. 机器学习使用什么编程语言_什么是机器学习项目的最佳编程语言
  3. 红日靶场(vulnstack)一 超全面详细的渗透测试学习笔记
  4. Swarm Mode负载均衡
  5. python-下载某短视频平台视频(高清无水印)
  6. 职 场 社 会 性 死 亡
  7. matlab trapz无穷,trapz(matlab中trapz函数用法)
  8. 自己开发的App在华为荣耀系列手机上安装失败,“未包含任何证书”
  9. vue中路由跳转的几种方式
  10. springboot的filter 过滤器的使用