如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?还是通过内部链接(static在C / C ++中)或在私有(匿名)名称空间中使其私有化的函数?
仅仅为了能够运行测试而更改方法或函数的访问修饰符似乎很糟糕。
更新:
大约十年后,测试私有方法或任何无法访问的成员的最佳方法可能是@Jailbreak来自Manifold框架。
@Jailbreak
@Jailbreak Foo foo = new Foo(); // Direct, *type-safe* access to *all* foo's members foo.privateMethod(x, y, z); foo.privateField = value;
这样,您的代码将保持类型安全和可读性。没有设计折衷,也没有为了测试而过度曝光的方法和字段。
如果您使用的是旧版Java应用程序,并且不允许更改方法的可见性,那么测试私有方法的最佳方法是使用反射。
在内部,我们使用助手来获取/设置private和private static变量以及调用private和private static方法。以下模式将使您几乎可以执行与私有方法和字段相关的所有操作。当然,您private static final不能通过反射更改变量。
private
private static
private static final
Method method = TargetClass.getDeclaredMethod(methodName, argClasses); method.setAccessible(true); return method.invoke(targetObject, argObjects);
对于字段:
Field field = TargetClass.getDeclaredField(fieldName); field.setAccessible(true); field.set(object, value);
注意: 1.TargetClass.getDeclaredMethod(methodName, argClasses)让您研究private方法。同样的事情也适用 getDeclaredField。 2.setAccessible(true)必须与私人玩耍。
TargetClass.getDeclaredMethod(methodName, argClasses)
getDeclaredField。 2.setAccessible(true)