问题

Java类中private方法通常只能被其所属类的调用,其他类只能望而却步,单元测试private方法也就一筹莫展。

尝试解法:

  1. 在测试时,手动将private改为public,测试完后再将其改回。
  2. 将测试方法写进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));}}

参考

  1. Junit测试private方法
  2. 阿里巴巴Java开发手册
  3. How do I test a private function or a class that has private methods, fields or inner classes?

如何单元测试Java的private方法相关推荐

  1. Java中private方法可以被重写吗?

    想要弄清楚这个问题,我们首先要知道的就是什么是方法重写. 这是百度的定义:方法重写又称方法覆盖 .方法的重写是指两个方法的返回值.方法名.参数的类型和个数相同 (子类重写父类的方法). 方法的重写,不 ...

  2. private方法如何进行单元测试?

    目录 问题来了 解决方法 1.不测试 2.改权限 3.进行内部测试 4.使用反射 具体实现 5 测试 补充 参考 在上一篇中:https://blog.csdn.net/qq_36110736/art ...

  3. static关键字是什么意思?java中是否可以覆盖一个private方法或者static方法

    一.static关键字是什么意思? static关键字表示静态的意思,用于修饰成员变量和成员函数.表示可以在没有类的实例的情况下,用类名.变量名或者类名.函数名,进行访问 二.java中是否可以覆盖( ...

  4. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  5. NDK开发 - C/C++ 访问 Java 变量和方法

    上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...

  6. 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:suo.im/6v9d64 为什么 main 方法是 ...

  7. 你知道为什么Java的main方法必须是public static void?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://suo.im/6v9d64 Main 方法是我 ...

  8. main方法_你知道为什么Java的main方法必须是public static void?

    来源:http://suo.im/6v9d64 Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public.static.void 的.当然, ...

  9. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

最新文章

  1. 《SAP FIORI 开发入门》课程答疑 第二期
  2. flutter开发环境搭建
  3. 使用jQuery卸载绑定的事件
  4. 学习笔记Kafka(五)—— Kafka 开发环境配置及Producer API
  5. jQuery EasyUI combobox多选及赋值、读取、回显
  6. 【工业控制】UV打印机喷头波形和墨水关系
  7. asp.net 2.0 主题中多CSS文件引用
  8. 用Emit技术替代反射
  9. Eclipse在选项卡上展示某个具体的视图
  10. 程序员“放弃” Python!?发生了啥?
  11. Wordpress博客首页能打开 子页打不开解决办法
  12. XCODE 9:最新功能详尽介绍
  13. dos-usboot-v1124(启动U盘制作工具)
  14. HDB3码的编码解释(简单粗暴)
  15. 安装火狐插件--截图软件metamask
  16. 预见2022 | 吴晓波年终秀 附PPT
  17. LCC编译器的源程序分析(27)基本语句
  18. WebGL(ThreeJS)加载乐高Ldraw模型案例
  19. 【昊鼎王五】pip安装pymssql模块时报错“PEP 517”怎么解决?
  20. Exiting on user cancel解决

热门文章

  1. java如何添加进程_如何创建一个进程,如何进程调用进程
  2. 月头月尾oracle取数,Oracle分析函数Over()的使用
  3. java 录音_用JAVA实现不限时录音功能
  4. 基于diff的文件同步算法(上)
  5. 【转】理解SQL Server的安全对象和权限
  6. 一步步编写操作系统 59 cpu的IO特权级1
  7. libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...
  8. webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法
  9. wince投屏苹果手机_怎么把手机上的导航映射到中控屏
  10. 谷歌浏览器检查更新时出错:无法启动更新检查(错误代码为 3: 0x80080005 -- system level)