Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试私有静态类的私有方法_Java_Junit - Fatal编程技术网

Java 如何测试私有静态类的私有方法

Java 如何测试私有静态类的私有方法,java,junit,Java,Junit,如何对私有静态类中的私有方法进行单元测试 public class ProjectModel { //some code private static class MyStaticClass{ private model (Object obj, Map<String , Object> model) } } 一般来说,不建议对私有方法和类进行测试。如果您仍然想测试一些非公共功能,我建议不要将这些方法

如何对私有静态类中的私有方法进行单元测试

 public class ProjectModel {
          //some code
        private static class MyStaticClass{
            private model (Object obj, Map<String , Object> model)
          }
}

一般来说,不建议对私有方法和类进行测试。如果您仍然想测试一些非公共功能,我建议不要将这些方法和类设置为
private
,而是
package private
,并将测试用例放在同一个包中(但像maven项目中通常做的那样放在单独的源代码目录中)

您的特定反射问题可以使用

Class.forName(ProjectModel.class.getName()+"$MyStaticClass")
    .getDeclaredMethod("model", methodParameters);

但我不建议使用这种方法,因为将来很难支持这种测试用例。

一般来说,不建议测试私有方法和类。如果您仍然想测试一些非公共功能,我建议不要将这些方法和类设置为
private
,而是
package private
,并将测试用例放在同一个包中(但像maven项目中通常做的那样放在单独的源代码目录中)

您的特定反射问题可以使用

Class.forName(ProjectModel.class.getName()+"$MyStaticClass")
    .getDeclaredMethod("model", methodParameters);

但我不建议使用这种方法,因为将来很难支持这种测试用例。

您可以尝试以下代码来解决异常:

Method method = projectModel.getClass().getDeclaredClasses()[0]
    .getDeclaredMethod("model", methodParameters);
出于测试目的,您可以尝试以下代码来调用
model
方法:

Class<?> innerClass = projectModel.getClass().getDeclaredClasses()[0];

Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);

Object mystaticClass = constructor.newInstance();
Method method = mystaticClass.getClass().getDeclaredMethod("model", new Class[]{Object.class,Map.class});

method.setAccessible(true);  
method.invoke(mystaticClass, null, null);
Class innerClass=projectModel.getClass().getDeclaredClasses()[0];
构造函数=innerClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Object mystaticClass=constructor.newInstance();
方法Method=mystaticClass.getClass().getDeclaredMethod(“model”,新类[]{Object.Class,Map.Class});
方法setAccessible(true);
调用(mystaticClass,null,null);

您可以尝试以下代码来解决异常:

Method method = projectModel.getClass().getDeclaredClasses()[0]
    .getDeclaredMethod("model", methodParameters);
出于测试目的,您可以尝试以下代码来调用
model
方法:

Class<?> innerClass = projectModel.getClass().getDeclaredClasses()[0];

Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);

Object mystaticClass = constructor.newInstance();
Method method = mystaticClass.getClass().getDeclaredMethod("model", new Class[]{Object.class,Map.class});

method.setAccessible(true);  
method.invoke(mystaticClass, null, null);
Class innerClass=projectModel.getClass().getDeclaredClasses()[0];
构造函数=innerClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Object mystaticClass=constructor.newInstance();
方法Method=mystaticClass.getClass().getDeclaredMethod(“model”,新类[]{Object.Class,Map.Class});
方法setAccessible(true);
调用(mystaticClass,null,null);

假设您的类
ProjectModel
在包
privateaccessor.tst
中,并且您的非静态方法
model
返回一个
int

package privateaccessor.tst;
public class ProjectModel {
  //some code
  private static class MyStaticClass{
    private int model (Object obj, Map<String , Object> model) {
      return 42;
    }
  }
}

假设您的类
ProjectModel
在包
privateaccessor.tst
中,并且您的非静态方法
model
返回一个
int

package privateaccessor.tst;
public class ProjectModel {
  //some code
  private static class MyStaticClass{
    private int model (Object obj, Map<String , Object> model) {
      return 42;
    }
  }
}

首先你应该问问自己:我真的需要为私有方法编写单元测试吗?如果您确实想测试它们,您不应该直接测试它们,而是通过使用它们的公共方法进行测试。有两件事:1:这不会编译,因为
model()
没有返回类型。2:私有方法不需要测试。相反,您应该确保此方法使用的非私有方法返回正确的结果。您正在从外部类获取声明的方法。这是一个有效的问题。没有理由投反对票…@Mena no调用的its是静态类中的一个方法,调用它的方法是公共的,但我需要测试私有方法部分。首先你应该问自己:我真的需要为私有方法编写单元测试吗?如果您确实想测试它们,您不应该直接测试它们,而是通过使用它们的公共方法进行测试。有两件事:1:这不会编译,因为
model()
没有返回类型。2:私有方法不需要测试。相反,您应该确保此方法使用的非私有方法返回正确的结果。您正在从外部类获取声明的方法。这是一个有效的问题。没有理由进行下一票…@Mena no它被调用的形式是静态类中的一个方法,调用它的方法是公共的,但是我需要测试私有方法部分。