mockito测试final类/static方法/自己new的对象
先准备几个类,方便后面讲解:
public final class FinalSampleUtils {
public static String foo() {
return "aaa";
}
public static String bar(String a) {
return "bar:" + a;
}
}
这是一个final类,里面有2个static方法。
public class NewObject {
public String haha() {
return "haha";
}
}
这是一个平淡无奇的类,没啥好说的。它俩的使用方式如下:
import org.springframework.stereotype.Service; @Service
public class SampleServiceImpl implements SampleService { NewObject obj; public SampleServiceImpl() {
obj = new NewObject();
} @Override
public void helloWorld() {
String foo = FinalSampleUtils.foo();
String bar = FinalSampleUtils.bar("test"); System.out.println("hello1:" + foo);
System.out.println("hello2:" + bar);
System.out.println("h:" + obj.haha());
}
}
这是一个普通的@Service实现类,但有2个注意的地方:
1. 里面用到的NewObject,并不是@Autowired之类由Spring注入的,而是自己new的
2. helloWorld里,使用了final类的静态方法,以及obj的普通方法。
在3.4以下的低版本mockito中,如果想mock helloWorld方法是很困难的,但在高版本中功能有所加强,参考下面的代码:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner; import static org.mockito.ArgumentMatchers.any; @RunWith(MockitoJUnitRunner.class)
public class SampleServiceImplTest { @Mock
NewObject obj; @InjectMocks
SampleServiceImpl sampleService; @Test
public void testHelloWorld() {
MockedStatic<FinalSampleUtils> mocked = Mockito.mockStatic(FinalSampleUtils.class); //mock不带参数的static方法
mocked.when(FinalSampleUtils::foo).thenReturn("bbb"); //mock带参数的static方法
mocked.when(() -> FinalSampleUtils.bar(any())).thenReturn("xxx"); //mock代码中自己new的实例及“该实例的方法”
MockedConstruction<NewObject> newObjectMocked = Mockito.mockConstruction(NewObject.class);
Mockito.when(obj.haha()).thenReturn("who am i ?"); sampleService.helloWorld(); }
}
跑出来的效果如下:
hello1:bbb
hello2:xxx
h:who am i ?
从输出上看,不管是带参还是不带参的static方法,都成功mock,返回了mock后的值,而且自己new的对象,也同样mock成功了。
关键:pom中的依赖要将mockito-core替换成mockito-inline
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.12.4</version>
<scope>test</scope>
</dependency>
注意:junit最好放在前面。
mockito测试final类/static方法/自己new的对象的更多相关文章
- 动态绑定、阻止继承,final类和方法
1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...
- java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”
/*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...
- java基础知识回顾之---java String final类普通方法的应用之“模拟字符串Trim方法”
/* * 4,模拟一个trim功能一致的方法.去除字符串两端的空白 * 思路: * 1,定义两个变量. * 一个变量作为从头开始判断字符串空格的角标.不断++. * 一个变量作为从尾开始判断字符串空 ...
- java基础知识回顾之---java String final类普通方法的应用之字符串数组排序
/* * 1,给定一个字符串数组.按照字典顺序进行从小到大的排序. * {"nba","abc","cba","zz", ...
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- JUnit单元测试实践:测试工具类和方法(EmptyUtils)
以前的时候(读大学时),我认为写单元测试太费事了.现在,我改变看法了. 工作中,为了提高Web开发的质量和效率,近期又为了保证自己的工具类等一系列可复用组件的质量,我煞费苦心地开始认真学习和撰写单元测 ...
- 135-PHP final类和方法都是不可被继承或覆盖的
<?php final class final_class{ //定义final修饰的类 } class myclass extends final_class{ //试图继承final修饰的类 ...
- java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”
/* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" * * 思路: * 1,既然取得是最大子串,先看 ...
- java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”
/* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个 ...
- 测试Random类nextInt()方法连续两次结果一样的概率
public static void main(String[] args) { int count = 0; int a = 0; Random r = new Random(); while (t ...
随机推荐
- K8s新手系列之初始Deployment资源
概述 官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ Deployment简称deploy ...
- Django REST框架中处理JWT令牌的认证的源码解析
想了解`JWTAuthentication`这个类的源码解析.`JWTAuthentication`是来自`rest_framework_simplejwt.authentication`模块的,它用 ...
- VitePress 集成 Twikoo 评论
Twikoo 是一个简洁.安全.免费的静态网站评论系统. 主要特点:免费搭建,部署简单,功能很完善,隐私护安全,通知发邮件,管理有内嵌,总之免费又方便 关于后端部署,大家可以看官网,或者这篇 Vite ...
- 50道常见Redis面试题,干货汇总
哪些大厂在使用Redis?github.twitter.微博.Stack Overflow.百度.阿里巴巴.美团和搜狐等都在用,所以今天小编当作搬运工,为大家整理了一份Redis面试题,合计50个 ...
- helmfile调试
说明 我们在调试helmfile编排的chart时,对于helm chart正常的情况下,我们编排的helmfile渲染模版的值出了问题,可能会存在以下的报错: helmfile template E ...
- 探索学习Hypermesh的有效方法
大家好!我是一名Hypermesh的学习者,最近在学习这个强大的有限元前处理软件时,总结了一些有效的学习方法,希望能与大家分享. 1. 熟悉软件界面和工具:首先,我们需要熟悉Hypermesh的界面和 ...
- 故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- AI应用实战课学习总结(11)用RNN做时序预测
大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第11站,一起了解RNN循环神经网络的基本概念 以及 通过RNN来做时序 ...
- CODING DevOps服务下线,受影响企业何去何从?如何进行迁移?
前两天CODING DevOps宣布产品下线,建议标准版用户2025年9月1前完成迁移.付费版用户2028年9月30日前完成数据迁移.有点突然,但也不意外,我是接触Coding最早的用户,经常作为学习 ...
- 深入浅出IEEE浮点数表示法
使用二进制定点表示浮点数十分麻烦,且由于有些浮点数的二进制不能精确表示,只能添加小数位数不断近似,使得位数开销极大.20世纪70年代已经有一些计算机厂家推出了自己的浮点数表示标准,但并不统一,于是在1 ...