猿问
下载APP

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

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

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

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


犯罪嫌疑人X
浏览 184回答 4
4回答

波斯汪

测试私有方法或任何无法访问的成员的最佳方法可能@Jailbreak来自Manifold框架。@Jailbreak Foo foo = new Foo();// Direct, *type-safe* access to *all* foo's membersfoo.privateMethod(x, y, z);foo.privateField = value;这样,您的代码仍然是类型安全且可读的。没有设计妥协,没有为测试而过度曝光的方法和领域。如果您有一些遗留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)需要与私人一起玩耍。

倚天杖

测试私有方法的最佳方法是通过另一种公共方法。如果无法执行此操作,则满足下列条件之一:私有方法是死代码您正在测试的课程附近有一种设计气味您尝试测试的方法不应该是私有的

HUWWW

当我在一个足够复杂的类中使用私有方法时,我觉得需要直接测试私有方法,这就是代码味道:我的类太复杂了。我解决此类问题的常用方法是梳理出一个包含有趣位的新类。通常,此方法及其与之交互的字段以及可能的另一种方法可以被提取到新类中。新类将这些方法公开为“公共”,因此它们可以进行单元测试。新旧课程现在都比原来的课程简单,这对我来说很棒(我需要保持简单,否则我会迷路!)。请注意,我并不是说人们在不使用大脑的情况下创建课程!这里的要点是使用单元测试的力量来帮助您找到好的新类。

喵喔喔

我过去曾使用反射来为Java做这个,在我看来这是一个很大的错误。严格来说,您不应该编写直接测试私有方法的单元测试。您应该测试的是该类与其他对象的公共合同; 你永远不应该直接测试对象的内部。如果另一个开发人员想要对该类进行少量内部更改(这不会影响类公共合同),则他/她必须修改基于反射的测试以确保其有效。如果在整个项目中反复执行此操作,则单元测试将不再是对代码运行状况的有用度量,并开始成为开发的障碍,并对开发团队造成烦扰。我建议改为使用代码覆盖工具(如Cobertura),以确保您编写的单元测试在私有方法中提供了良好的代码覆盖率。这样,您可以间接测试私有方法正在做什么,并保持更高的敏捷性。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答