访问私有成员进行单元测试

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