协慌网

登录 贡献 社区

如何测试私有函数或具有私有方法,字段或内部类的类?

如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用 xUnit)?或者通过内部链接 (在 C / C ++ 中为static )或在私有( 匿名 )命名空间中使其成为私有的函数?

为了能够运行测试而改变方法或函数的访问修饰符似乎很糟糕。

答案

如果您有一些遗留Java应用程序,并且不允许更改方法的可见性,那么测试私有方法的最佳方法是使用反射

在内部,我们使用帮助程序来获取 / 设置privateprivate static变量,以及调用privateprivate 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)需要使用 privates。

测试私有方法的最佳方法是通过另一种公共方法。如果无法执行此操作,则满足下列条件之一:

  1. 私有方法是死代码
  2. 您正在测试的课程附近有一种设计气味
  3. 您尝试测试的方法不应该是私有的

当我在一个足够复杂的类中有私有方法时,我觉得需要直接测试私有方法,这就是代码味道:我的类太复杂了。

我解决这些问题的常用方法是梳理一个包含有趣位的新类。通常,此方法及其与之交互的字段可能会被提取到新类中。

新类将这些方法公开为 “公共”,因此它们可以进行单元测试。新旧课程现在都比原来的课程简单,这对我来说很棒(我需要保持简单,否则我会迷路!)。

请注意,我并不是说人们在不使用大脑的情况下创建课程!这里的要点是使用单元测试的力量来帮助您找到好的新类。