java 为私有类编写测试用例

v09wglhw  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(155)

有一个公共类,其中一个私有类已经编写了一些属性和方法。现在,我们想为这个私有类编写测试用例,但由于它是一个私有类,我们不能创建该类的示例。我尝试使用反射实用程序,但这只能帮助公共类的私有方法。

public class Class1{

   private class Class2{
      int a1;
       void method ()
    }
}
idv4meu8

idv4meu81#

你可以使用反射,我能够得到以下工作。
考虑以下情况,Class1Class

public class Class1 {
    private class Class2 {
        int a1;
        void method() {
            System.out.println("value");
        }
    }
}

下面的方法将返回Class2的示例。

Class1.Class2 instance() throws ReflectiveOperationException {
    Class1 class1 = new Class1();
    Class<?> object = Class1.class.getDeclaredClasses()[0];
    Constructor<?> constructor = object.getDeclaredConstructors()[0];
    constructor.setAccessible(true);
    return (Class1.Class2) constructor.newInstance(class1);
}

此外,来自JUnit 4常见问题解答。
JUnit 4-如何测试私有方法?
测试私有方法可能表明这些方法应该移到另一个类中以提高可重用性。
但如果你一定要...
如果您使用的是JDK 1.3或更高版本,则可以在PrivilegedAccessor的帮助下使用反射来破坏访问控制机制。有关如何使用它的详细信息,请阅读this article
如果您使用的是JDK 1.6或更高版本,并且使用@Test注解测试,则可以使用Dp 4j在测试方法中注入反射。有关如何使用它的详细信息,请参阅this test script

zazmityj

zazmityj2#

如果嵌入类的访问修饰符与公共getter相结合,那么它将更加可行和可靠。此外,每次调用retrieveClass()时,它都会强制您拥有一个新示例。
说...

public class Class1 { 
  private class Class2 { 
   int a1; 
   void method ();
  }
   public Class2 retrieveClass() { 
     return new Class2();
 }  
}

即使你让反射在幕后用一种嘲弄的行为来处理它,它可能会工作,但我也不会依赖于那些不可靠的代码。因为你需要它可测试。
或者,这些可能是不需要的解决方法:

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
   method.setAccessible(true);
   return method.invoke(targetObject, argObjects);

   Class obj = test.getClass(); // create an object of the class named Class

   Field field = obj.getDeclaredField("fieldname"); // access the private variable

   field.setAccessible(true); // make private field accessible

   field.set(test,"value"); // setting a field value

相关问题