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它被调用的形式是静态类中的一个方法,调用它的方法是公共的,但是我需要测试私有方法部分。