如何单元测试Java的private方法
问题
Java类中private方法通常只能被其所属类的调用,其他类只能望而却步,单元测试private方法也就一筹莫展。
尝试解法:
- 在测试时,手动将private改为public,测试完后再将其改回。
- 将测试方法写进private方法的所属类中,这样就能调用private方法了。
上述解法虽然可行,但这些解法或多或少地违背单元测试应遵守AIR原则。
单元测试在线上运行时,感觉像空气(AIR)那样透明,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。
- A:Automatic(自动化)
- I:Independent(独立性)
- R:Repeatable(可重复)
解法
先创建一个测试目标类App作为示例,目标是测试App类中private方法callPrivateMethod():
public class App {public void doSomething() {callPrivateMethod();}private String callPrivateMethod() {return "Private method is called.";}}
一
我们可以用Java的反射特性来突破private的限制,从而对private方法进行单元测试:
单元测试代码:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import org.junit.Assert;
import org.junit.Test;public class AppTest {@Testpublic void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {App app = new App();Method privateMethod = app.getClass().getDeclaredMethod("callPrivateMethod");privateMethod.setAccessible(true);Assert.assertEquals("Private method is called.", privateMethod.invoke(app));}
}
二
引入第三方工具,如Spring测试框架。
引入依赖:
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.5</version><scope>test</scope>
</dependency>
单元测试代码:
import static org.junit.Assert.*;import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;public class AppTest {@Testpublic void test() {App app = new App();assertEquals("Private method is called.", //ReflectionTestUtils.invokeMethod(app, "callPrivateMethod", null));}}
参考
- Junit测试private方法
- 阿里巴巴Java开发手册
- How do I test a private function or a class that has private methods, fields or inner classes?
如何单元测试Java的private方法相关推荐
- Java中private方法可以被重写吗?
想要弄清楚这个问题,我们首先要知道的就是什么是方法重写. 这是百度的定义:方法重写又称方法覆盖 .方法的重写是指两个方法的返回值.方法名.参数的类型和个数相同 (子类重写父类的方法). 方法的重写,不 ...
- private方法如何进行单元测试?
目录 问题来了 解决方法 1.不测试 2.改权限 3.进行内部测试 4.使用反射 具体实现 5 测试 补充 参考 在上一篇中:https://blog.csdn.net/qq_36110736/art ...
- static关键字是什么意思?java中是否可以覆盖一个private方法或者static方法
一.static关键字是什么意思? static关键字表示静态的意思,用于修饰成员变量和成员函数.表示可以在没有类的实例的情况下,用类名.变量名或者类名.函数名,进行访问 二.java中是否可以覆盖( ...
- List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...
- NDK开发 - C/C++ 访问 Java 变量和方法
上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...
- 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:suo.im/6v9d64 为什么 main 方法是 ...
- 你知道为什么Java的main方法必须是public static void?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://suo.im/6v9d64 Main 方法是我 ...
- main方法_你知道为什么Java的main方法必须是public static void?
来源:http://suo.im/6v9d64 Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public.static.void 的.当然, ...
- java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...
[单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...
最新文章
- 《SAP FIORI 开发入门》课程答疑 第二期
- flutter开发环境搭建
- 使用jQuery卸载绑定的事件
- 学习笔记Kafka(五)—— Kafka 开发环境配置及Producer API
- jQuery EasyUI combobox多选及赋值、读取、回显
- 【工业控制】UV打印机喷头波形和墨水关系
- asp.net 2.0 主题中多CSS文件引用
- 用Emit技术替代反射
- Eclipse在选项卡上展示某个具体的视图
- 程序员“放弃” Python!?发生了啥?
- Wordpress博客首页能打开 子页打不开解决办法
- XCODE 9:最新功能详尽介绍
- dos-usboot-v1124(启动U盘制作工具)
- HDB3码的编码解释(简单粗暴)
- 安装火狐插件--截图软件metamask
- 预见2022 | 吴晓波年终秀 附PPT
- LCC编译器的源程序分析(27)基本语句
- WebGL(ThreeJS)加载乐高Ldraw模型案例
- 【昊鼎王五】pip安装pymssql模块时报错“PEP 517”怎么解决?
- Exiting on user cancel解决
热门文章
- java如何添加进程_如何创建一个进程,如何进程调用进程
- 月头月尾oracle取数,Oracle分析函数Over()的使用
- java 录音_用JAVA实现不限时录音功能
- 基于diff的文件同步算法(上)
- 【转】理解SQL Server的安全对象和权限
- 一步步编写操作系统 59 cpu的IO特权级1
- libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...
- webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法
- wince投屏苹果手机_怎么把手机上的导航映射到中控屏
- 谷歌浏览器检查更新时出错:无法启动更新检查(错误代码为 3: 0x80080005 -- system level)