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

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. js--弹出对话框、改变控件内容、验证输入邮箱的合法性

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 2024新版Axure RP大数据可视化大屏模板68套及通用组件+PSD文件

    Axure RP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版.新版本相比于V1版内容更加丰富和全面,但依然秉承"敏捷易用"的制作 ...

  3. Windows配置VS Code详细流程

      本文介绍Visual Studio Code(VS Code)软件在Windows操作系统电脑中的下载.安装.运行方法.   Visual Studio Code(简称VS Code)是一款由微软 ...

  4. python中list、tuple、set、dict区别

    list.tuple.set.dict区别 参考:python的列表,字典,元组,集合的区别和各自使用方法 遍历set 由于set也是一个集合,所以,遍历set和遍历list类似,都可以通过for循环 ...

  5. JavaScript中通过闭包来实现私有变量的一种方法

    'use strict'; const SecretHolder = (function () { const secrets = new WeakMap(); return class { cons ...

  6. 为何PostgreSQL没有聚集索引?解读两大数据库的设计差异

    为何PostgreSQL没有聚集索引?解读两大数据库的设计差异 前言 高效的数据检索是数据库管理的基石, PostgreSQL和SQL Server都能提供强大的数据访问方法以支持各种工作负载方面表现 ...

  7. BD202404 110串

    百度之星一场,t4 题目链接: 对于这种连续状态限制的字符串方案数,首先考虑dp, 首先定义好每个状态方便转移,0状态是结尾为0,1状态是结尾1个连续1,2状态是结尾两个连续1,有以下关系 if(s[ ...

  8. Java进阶知识点:接口幂等性

    幂等概念    在计算机中,表示对同一个过程应用相同的参数多次和应用一次产生的效果是一样,这样的过程即被称为满足幂等性.    也可以进行如下表述:一个HTTP请求方法,如果被请求多次和被请求一次效果 ...

  9. 20244104 实验二《Python程序设计》实验报告

    课程:<Python程序设计> 班级: 2441 姓名: 陈思淼 学号:20244104 实验教师:王志强 实验日期:2025年4月5日 必修/选修: 公选课 1.实验内容 设计并完成一个 ...

  10. Go基础0x02-go build -tags使用

    Go语言提供的build -tags条件编译特性,顾名思义,只有在特定条件下才会构建对应的代码. 本文实现一个根据go bulid -tags功能来编译不同版本的做法,version参数根据tags传 ...