当前位置: 首页 > 面试题库 >

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

严知
2023-03-14
问题内容

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

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


问题答案:

更新:

大约十年后,测试私有方法或任何无法访问的成员的最佳方法可能是@Jailbreak来自Manifold框架。

@Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;

这样,您的代码将保持类型安全和可读性。没有设计折衷,也没有为了测试而过度曝光的方法和字段。

如果您使用的是旧版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)必须与私人玩耍。



 类似资料:
  • 问题内容: 我有一堂课,负责将合同从CSV导入数据库。 该类本身只有一个开始导入的公共方法,而其他方法都是私有的(因为只有该类本身将使用,并且它们保留逻辑)。 我开始使用Spock对该类进行测试,并且有许多私有方法,该如何测试? 我应该将它们公开进行测试吗?测试仅主要方法,公开一种? 什么是最好的? 问题答案: 从理论上讲,您的私有方法最终会被一种公共方法所使用,否则根本就不会使用它们。因此,通常

  • 我正在重构一个越来越大的android项目。运行lint使我能够在外部类和内部类之间访问JSME问题私有成员。考虑下面的例子 我得到消息了 应用问题解决方案会将源更改为 我现在有点困惑。直到现在,我还以为这个例子相当于 在这种情况下,我错了吗?还是这是棉绒的问题?

  • 公共方法getA()的测试按预期工作,但私有方法getB()的测试不返回模拟值“b”,而是返回与方法getB()的实际返回值相对应的“b”。必须如何调整对getB()的测试,以便返回模拟值“b”?

  • 我认为这是Spring AOP的局限性 除了Spring AOP还有别的选择吗

  • 问题内容: 我有一堂课。 在我的类方法中,我实例化该类,如下所示: 编译器将此代码转换为: 使用反射表明该类具有以下综合的构造函数: 由于该类是,因此编译器会将该构造函数添加到该类中,因此没有人可以实例化该类。但是很明显,该类应该能够实例化它,因此编译器添加了另一个包私有构造函数,后者又调用了私有构造函数。另外,由于package- private构造函数的名称中包含该名称,因此普通的Java代码

  • 我正在阅读一书,在中提到: 为了便于测试,您可能会尝试使类、接口或成员更容易访问。在某种程度上这是好的。为了测试一个公共类包的私有成员是可以接受的,但将可访问性提高到更高是不可接受的。换句话说,将类、接口或成员作为包导出API的一部分以促进测试是不可接受的。