java测试私有方法被定义为具有私有访问修饰符的方法,并且仅限于在定义类中访问,并且在其子类中不可见,因为它们不符合重写的条件,但是,我们可以定义子类中具有相同名称的方法并且可以在父类中访问,还可以通过将私有方法包访问来测试私有方法,这允许我们直接使用 JUnit 从同一包中的测试类中测试它们,但测试SuiteRunner 中的私有方法比 JUnit 中的测试更容易。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
无论您使用 JUnit 还是 SuiteRunner,我们都有四种基本方法来测试私有方法,
有时私有方法正在执行非常复杂的任务,并且测试应该经过很好的测试,因此我们不希望用户有权访问这些方法,因为私有方法需要受到保护。
私有方法不能间接测试,只能测试它们对调用它们的公共方法的影响。测试私有方法可能表明这些方法已移至另一个有助于/支持可重用性的类中。
如果我们从中提取已经运行并且具有良好单元测试覆盖率的私有方法,那么该方法已经存在于足以测试的单元测试中,因此我们不需要为私有方法编写更多的单元测试。但是如果我们想在调用方法之前编写私有方法,并且希望在编写私有方法之前编写单元测试。
示例
public class testClass { private String testMethod(String s) { return s; } }
上面的示例仅用于测试私有方法。如果我们有一个类“testClass”,那么它被“testMethod( )”方法调用,那么该方法是私有的,通过传递字符串或对象我们可以返回值。
提供方法包访问权限对于使用 JUnit 测试私有方法来说效果很好,但成本稍高。当一个方法具有私有访问修饰符时,它就是该类的实现的一部分。如果我们只是尝试使用包中另一个类中的类,我们可以忽略该方法,并且可以通过使用包访问方法来解决这个问题。另外,可以使用方法访问包来测试类的非公共方法。
第一种方法是将方法包设为私有,不使用访问修饰符,并将测试放入同一个包中,这是一种常见的方法,但如果我们想要其他代码,那么第二种方法是将方法设为公共。
在java中测试私有方法的第三件事是使用嵌套测试类,它可以通过在被测试的生产类中嵌套一个静态类来完成。嵌套类可以访问其封闭类的私有成员,它可以直接调用私有方法。静态类本身可以是包访问,使其成为白盒测试的加载部分。
这个嵌套测试类的缺点是,如果我们不希望在我们的部门 JAR 文件中访问嵌套类,那么我们需要做额外的工作来提取它。这可能会出现问题,因为质量分析师会更改源代码。
现在来讨论反射的下一个用途。使用反射来测试私有方法的优点是它提供了测试代码和生产代码的清晰分离。正如我们在嵌套类方法中已经看到的那样,测试不需要在类内部进行测试,其中类正在接受测试,但它们可以与执行类的包级别和公共方法的其他测试放在一起。由于我们使用嵌套类,因此我们不需要在包访问级别添加任何额外的嵌套类。
反射是一个 API,用于在运行时检查或修改方法、类、接口的行为。使用反射的缺点是测试代码要繁琐得多,因为它使用了反射 API。
示例:描述反射使用的Java程序
代码:
import java.lang.reflect.Method; import java.lang.reflect.Field; class Test { private String s; public Test() { s = "Java Testing Methods"; } public void method1() { System.out.println("The string is " + s); } public void method2(int n) { System.out.println("The number is " + n); } private void method3() { System.out.println("Private method invoked"); } } class Reflect { public static void main(String args[]) throws Exception { Test obj = new Test(); Class cls = obj.getClass(); System.out.println("The name of class is " + cls.getName()); System.out.println("The public methods of class are : "); Method[] methods = cls.getMethods(); for (Method method:methods) System.out.println(method.getName()); Method methodcall1 = cls.getDeclaredMethod("method2", int.class); methodcall1.invoke(obj, 19); Field field = cls.getDeclaredField("s"); field.setAccessible(true); field.set(obj, "JAVA"); Method methodcall2 = cls.getDeclaredMethod("method1"); methodcall2.invoke(obj); Method methodcall3 = cls.getDeclaredMethod("method3"); methodcall3.setAccessible(true); methodcall3.invoke(obj); } }
输出:
在上面的java程序中,首先,我们必须导入java.lang包,然后在类中创建一个私有字段,并创建构造函数。 method1() 已被视为不带参数的公共方法,然后创建了 method2() 也是一个公共方法,但带有整数参数和私有方法 method3 已被撤销,上述三个方法在 Reflect 类中调用,输出如上所示截图。
在本文中,我们得出的结论是,我们不应该直接测试私有方法,而只测试它们对调用它们的公共方法的影响。此外,我们得出的结论是测试应该只访问类的公共接口。如果我们测试私有方法,则将反射代码安排到私有静态类中。
以上是Java 测试私有方法的详细内容。更多信息请关注PHP中文网其他相关文章!