先准备几个类,方便后面讲解:

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的对象的更多相关文章

  1. 动态绑定、阻止继承,final类和方法

    1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...

  2. java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

    /*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...

  3. java基础知识回顾之---java String final类普通方法的应用之“模拟字符串Trim方法”

    /* * 4,模拟一个trim功能一致的方法.去除字符串两端的空白  * 思路: * 1,定义两个变量. * 一个变量作为从头开始判断字符串空格的角标.不断++. * 一个变量作为从尾开始判断字符串空 ...

  4. java基础知识回顾之---java String final类普通方法的应用之字符串数组排序

    /* * 1,给定一个字符串数组.按照字典顺序进行从小到大的排序. * {"nba","abc","cba","zz", ...

  5. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  6. JUnit单元测试实践:测试工具类和方法(EmptyUtils)

    以前的时候(读大学时),我认为写单元测试太费事了.现在,我改变看法了. 工作中,为了提高Web开发的质量和效率,近期又为了保证自己的工具类等一系列可复用组件的质量,我煞费苦心地开始认真学习和撰写单元测 ...

  7. 135-PHP final类和方法都是不可被继承或覆盖的

    <?php final class final_class{ //定义final修饰的类 } class myclass extends final_class{ //试图继承final修饰的类 ...

  8. java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”

    /* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" *  * 思路: * 1,既然取得是最大子串,先看 ...

  9. java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”

    /* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个 ...

  10. 测试Random类nextInt()方法连续两次结果一样的概率

    public static void main(String[] args) { int count = 0; int a = 0; Random r = new Random(); while (t ...

随机推荐

  1. K8s新手系列之初始Deployment资源

    概述 官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ Deployment简称deploy ...

  2. Django REST框架中处理JWT令牌的认证的源码解析

    想了解`JWTAuthentication`这个类的源码解析.`JWTAuthentication`是来自`rest_framework_simplejwt.authentication`模块的,它用 ...

  3. VitePress 集成 Twikoo 评论

    Twikoo 是一个简洁.安全.免费的静态网站评论系统. 主要特点:免费搭建,部署简单,功能很完善,隐私护安全,通知发邮件,管理有内嵌,总之免费又方便 关于后端部署,大家可以看官网,或者这篇 Vite ...

  4. 50道常见Redis面试题,干货汇总

      哪些大厂在使用Redis?github.twitter.微博.Stack Overflow.百度.阿里巴巴.美团和搜狐等都在用,所以今天小编当作搬运工,为大家整理了一份Redis面试题,合计50个 ...

  5. helmfile调试

    说明 我们在调试helmfile编排的chart时,对于helm chart正常的情况下,我们编排的helmfile渲染模版的值出了问题,可能会存在以下的报错: helmfile template E ...

  6. 探索学习Hypermesh的有效方法

    大家好!我是一名Hypermesh的学习者,最近在学习这个强大的有限元前处理软件时,总结了一些有效的学习方法,希望能与大家分享. 1. 熟悉软件界面和工具:首先,我们需要熟悉Hypermesh的界面和 ...

  7. 故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障

    我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...

  8. AI应用实战课学习总结(11)用RNN做时序预测

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第11站,一起了解RNN循环神经网络的基本概念 以及 通过RNN来做时序 ...

  9. CODING DevOps服务下线,受影响企业何去何从?如何进行迁移?

    前两天CODING DevOps宣布产品下线,建议标准版用户2025年9月1前完成迁移.付费版用户2028年9月30日前完成数据迁移.有点突然,但也不意外,我是接触Coding最早的用户,经常作为学习 ...

  10. 深入浅出IEEE浮点数表示法

    使用二进制定点表示浮点数十分麻烦,且由于有些浮点数的二进制不能精确表示,只能添加小数位数不断近似,使得位数开销极大.20世纪70年代已经有一些计算机厂家推出了自己的浮点数表示标准,但并不统一,于是在1 ...