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 ...
随机推荐
- CTF_RSA解密学习
CTF_RSA解密学习 00X00 .先看了一边李永乐老师的视频 https://www.bilibili.com/video/av26639065/ 00X01.对称.非对称算法了解 对称算法,加解 ...
- Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
Spring Boot 不能加载 tcnative-2.dll 库 本文将介绍怎样解决 Spring Boot 在启动时抛出 "org.apache.tomcat.jni.LibraryNo ...
- 【MOOC】北京理工大学Python网络爬虫与信息提取慕课答案-综合挑出了一些很难评的慕课测验题
1 Requests库中的get()方法最常用,下面哪个说法正确? ...
- 1、Java相关工具下载及准备
相关准备 oracle jdk8:oracle官网. IDEA:官网 Maven:官网,下第二个 Redis:windows, MySQL:官网归档, RabbitMQ:csdn Java环境配置 变 ...
- WPF 粉笔绘制
在做白板书写的时候,会有各种笔的绘制,比如 书写笔.马克笔.演示笔等等.粉笔的功能需求也是很有必要的. 上网搜了一圈,几乎没有绘制粉笔的. 有的是毛笔.楷体等绘制的如下博客: wpf inkcanva ...
- Intellij Idea 通过svn或者git提交代码时速度慢的解决办法
问题分析:在使用 IntelliJ IDEA 操作Git的时候,Git响应速度特别满,等待差不多10秒.甚至更长时间才完成操作,真是等的花儿都谢了. 解决方案:更改IntelliJ IDE ...
- java springboot项目启动脚本,指定jdk、指定yml配置文件
start.bat @echo off rem 设置Java路径,根据你的实际情况修改 set JAVA_PATH="./jdk-17.0.6/bin/java.exe" rem ...
- 电脑上多个git账户并且为不同仓库设置不同的用户名
说明 生成多个公钥命令 我这里以Gitee和我公司内网Gitlab举例,打开git bash (右键,Git Bash Here) 首先生成Gitee的 依次执行以下命令 git config --g ...
- anaconda基本操作及一些问题的解决记录
anaconda虚拟环境 # anaconda 创建虚拟环境: conda create -n 虚拟环境名称 python=版本号 查看所有虚拟环境: conda env list 使用虚拟环境: c ...
- pytorch入门 - 微调huggingface大模型
在自然语言处理(NLP)领域,预训练语言模型如BERT已经成为主流.HuggingFace提供的Transformers库让我们能够方便地使用这些强大的模型. 本文将详细介绍如何使用PyTorch微调 ...