访问私有成员进行单元测试
Accessing private members for unit testing
通常当我用 C++ 编写单元测试时,我会向测试者声明测试 class 友元。这样我就可以通过检查成员变量直接检查操作的结果。
Java 没有朋友,如何实现相同的行为?
我在这里不是在谈论简单的 getter 和 setter,在这些地方测试是微不足道的,而是操作结果在内部存储在 class 中并且不暴露给外界的情况。
您可以使用 PowerMock 框架来 模拟 给定 class 中的私有成员。您可以参考 link 以获取有关如何执行此操作的示例。
如果您不想使用框架,您可以使用 Java 反射
在 Java
中使用反射访问私有字段的值
Person privateRyan = new Person("John" , "8989736353");
Field privateField = person.getDeclaredField("phone");
//this call allows private fields to be accessed via reflection
privateField.setAccessible(true);
//getting value of private field using reflection
String value = (String) privateField.get(privateRyan);
使用反射访问私有方法
Method privateMethod = person.getDeclaredMethod("call");
//making private method accessible using reflection
privateMethod.setAccessible(true);
//calling private method using reflection in java
privateMethod.invoke(privateRyan);
(来自:http://javarevisited.blogspot.com/2012/05/how-to-access-private-field-and-method.html)
您还可以将测试 classes 移动到与测试 class 相同的包中,并对字段或方法使用 package-private(无显式修饰符)。
有关详细信息,请阅读 Controlling Access to Members of a Class
通常当我用 C++ 编写单元测试时,我会向测试者声明测试 class 友元。这样我就可以通过检查成员变量直接检查操作的结果。 Java 没有朋友,如何实现相同的行为? 我在这里不是在谈论简单的 getter 和 setter,在这些地方测试是微不足道的,而是操作结果在内部存储在 class 中并且不暴露给外界的情况。
您可以使用 PowerMock 框架来 模拟 给定 class 中的私有成员。您可以参考 link 以获取有关如何执行此操作的示例。
如果您不想使用框架,您可以使用 Java 反射
在 Java
中使用反射访问私有字段的值Person privateRyan = new Person("John" , "8989736353");
Field privateField = person.getDeclaredField("phone");
//this call allows private fields to be accessed via reflection
privateField.setAccessible(true);
//getting value of private field using reflection
String value = (String) privateField.get(privateRyan);
使用反射访问私有方法
Method privateMethod = person.getDeclaredMethod("call");
//making private method accessible using reflection
privateMethod.setAccessible(true);
//calling private method using reflection in java
privateMethod.invoke(privateRyan);
(来自:http://javarevisited.blogspot.com/2012/05/how-to-access-private-field-and-method.html)
您还可以将测试 classes 移动到与测试 class 相同的包中,并对字段或方法使用 package-private(无显式修饰符)。 有关详细信息,请阅读 Controlling Access to Members of a Class