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

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. CTF_RSA解密学习

    CTF_RSA解密学习 00X00 .先看了一边李永乐老师的视频 https://www.bilibili.com/video/av26639065/ 00X01.对称.非对称算法了解 对称算法,加解 ...

  2. Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)

    Spring Boot 不能加载 tcnative-2.dll 库 本文将介绍怎样解决 Spring Boot 在启动时抛出 "org.apache.tomcat.jni.LibraryNo ...

  3. 【MOOC】北京理工大学Python网络爬虫与信息提取慕课答案-综合挑出了一些很难评的慕课测验题

    1 Requests库中的get()方法最常用,下面哪个说法正确?‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪ ...

  4. 1、Java相关工具下载及准备

    相关准备 oracle jdk8:oracle官网. IDEA:官网 Maven:官网,下第二个 Redis:windows, MySQL:官网归档, RabbitMQ:csdn Java环境配置 变 ...

  5. WPF 粉笔绘制

    在做白板书写的时候,会有各种笔的绘制,比如 书写笔.马克笔.演示笔等等.粉笔的功能需求也是很有必要的. 上网搜了一圈,几乎没有绘制粉笔的. 有的是毛笔.楷体等绘制的如下博客: wpf inkcanva ...

  6. Intellij Idea 通过svn或者git提交代码时速度慢的解决办法

       问题分析:在使用 IntelliJ IDEA 操作Git的时候,Git响应速度特别满,等待差不多10秒.甚至更长时间才完成操作,真是等的花儿都谢了.    解决方案:更改IntelliJ IDE ...

  7. java springboot项目启动脚本,指定jdk、指定yml配置文件

    start.bat @echo off rem 设置Java路径,根据你的实际情况修改 set JAVA_PATH="./jdk-17.0.6/bin/java.exe" rem ...

  8. 电脑上多个git账户并且为不同仓库设置不同的用户名

    说明 生成多个公钥命令 我这里以Gitee和我公司内网Gitlab举例,打开git bash (右键,Git Bash Here) 首先生成Gitee的 依次执行以下命令 git config --g ...

  9. anaconda基本操作及一些问题的解决记录

    anaconda虚拟环境 # anaconda 创建虚拟环境: conda create -n 虚拟环境名称 python=版本号 查看所有虚拟环境: conda env list 使用虚拟环境: c ...

  10. pytorch入门 - 微调huggingface大模型

    在自然语言处理(NLP)领域,预训练语言模型如BERT已经成为主流.HuggingFace提供的Transformers库让我们能够方便地使用这些强大的模型. 本文将详细介绍如何使用PyTorch微调 ...