如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?或者通过拥有私有的功能 内部联系 (static
在C / C ++)或私人(匿名)命名空间?
为了能够运行测试而改变方法或函数的访问修饰符似乎很糟糕。
如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?或者通过拥有私有的功能 内部联系 (static
在C / C ++)或私人(匿名)命名空间?
为了能够运行测试而改变方法或函数的访问修饰符似乎很糟糕。
如果你有一些遗产 Java的 应用程序,并且您不允许更改方法的可见性,测试私有方法的最佳方法是使用 反射。
在内部,我们使用帮助器来获取/设置 private
和 private static
变量以及调用 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)
需要和私人一起玩。
测试私有方法的最佳方法是通过另一种公共方法。如果无法执行此操作,则满足下列条件之一:
当我在一个足够复杂的类中有私有方法时,我觉得需要直接测试私有方法,这就是代码味道:我的类太复杂了。
我解决这些问题的常用方法是梳理一个包含有趣位的新类。通常,此方法及其与之交互的字段可能会被提取到新类中。
新类将这些方法公开为“公共”,因此它们可以进行单元测试。新旧课程现在都比原来的课程简单,这对我来说很棒(我需要保持简单,否则我会迷路!)。
请注意,我并不是说人们在不使用大脑的情况下创建课程!这里的要点是使用单元测试的力量来帮助您找到好的新类。
我用过 反射 在过去为Java做这个,在我看来这是一个很大的错误。
严格来说,你应该 不 编写直接测试私有方法的单元测试。你是什么 应该 测试是该类与其他对象的公共合同;你永远不应该直接测试对象的内部。如果另一个开发人员想要对该类进行少量内部更改(这不会影响类公共合同),则他/她必须修改基于反射的测试以确保其有效。如果您在整个项目中反复执行此操作,则单元测试将不再是对代码运行状况的有用度量,并开始成为开发的障碍,并对开发团队造成烦扰。
我建议改为使用Cobertura等代码覆盖工具,以确保您编写的单元测试能够在私有方法中提供良好的代码覆盖率。这样,您可以间接测试私有方法正在做什么,并保持更高的敏捷性。
从这篇文章: 使用JUnit和SuiteRunner测试私有方法 (Bill Venners),你基本上有4种选择:
- 不要测试私有方法。
- 给方法包访问权限。
- 使用嵌套测试类。
- 使用反射。
通常,单元测试旨在运用类或单元的公共接口。因此,私有方法是您不希望显式测试的实现细节。
只是我想要测试私有方法的两个例子:
SecurityManager
没有配置来防止这种情况)。我理解只测试“合同”的想法。但是我没有看到人们可以提倡实际上没有测试代码 - 你的里程可能会有所不同。
因此,我的权衡涉及使JUnits与反射复杂化,而不是损害我的安全性和SDK。
私有方法由公共方法调用,因此公共方法的输入还应测试由这些公共方法调用的私有方法。当公共方法失败时,那可能是私有方法失败。